• 算法--求需要排序的最短子数组问题



    最短子数组练习题

     

    第19节 最短子数组练习题

     

    对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。

    给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。

    测试样例:
    [1,4,6,5,9,10],6
    返回:2
     
     
     
     
     
     
    1
    import java.util.*;
    2
    
    
    3
    public class Subsequence {
    4
        public int shortestSubsequence(int[] A, int n) {
    5
            //假定最大值,最小值
    6
            int max = A[0];
    7
            int min = A[A.length - 1];
    8
    
    
    9
            //i和j之间的范围便是需要排序的最短子数组(一开始假定全部范围)
    10
            int p = 0, q = A.length - 1;
    11
    
    
    12
            /**
    13
             * 从右向左遍历,找出不合适数的最右范围
    14
             * (遍历过部分的最大值大于当前正在遍历的值,那么当前值就是invalid,那么真实排序之后,这个最大值在当前位置,或者是更右的位置)
    15
             * 
    16
             * 只记录发生这种情况的最右位置
    17
             */
    18
            for(int i = 1; i < A.length; i++){
    19
                if(max > A[i]) p = i;
    20
                else max = A[i];
    21
            }        
    22
            /**
    23
             * 从左向右遍历,找出不合适数的最左范围
    24
             * (遍历过部分的最小值小于当前正在遍历的值,那么当前值就是invalid,那么真实排序之后,这个最小值在当前位置,或者是更左的位置)
    25
             * 
    26
             * 只记录发生这种情况的最左位置
    27
             */
    28
            for(int i = A.length-2; i > -1; i--){
    29
                if(min < A[i]) q = i;
    30
                else min = A[i];
    31
            } 
    32
    
    
    33
            if(p == 0 && q == A.length - 1){
    34
                return 0;//证明原数组是有序的
    35
            }
    36
            return p-q+1;
    37
        }
    38
    }
     
     
    您的代码已保存
    答案正确:恭喜!您提交的程序通过了所有的测试用例
     
     
  • 相关阅读:
    访问oss压缩文件失败
    uniapp项目再使用vue-cli启动压缩失败
    航天丰益面试题
    axios上传图片遇见问题
    formateDate
    mongoose中Documents的save方法
    腾讯云nginx配置https
    filter逻辑bug
    vue-infinite-loading 过滤器tab正确使用
    使用pem连接服务器
  • 原文地址:https://www.cnblogs.com/haozhengfei/p/41f817879b5c800789faabb52fb2eeec.html
Copyright © 2020-2023  润新知