日月的弯刀  
Where Amazing Happens!

 


最短子数组练习题

 

第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
}
 
 
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
 
 
posted on 2017-03-12 00:40  日月的弯刀  阅读(1505)  评论(0编辑  收藏  举报