您的位置:首页 > 其它

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

2017-03-12 00:40 357 查看

最短子数组练习题











第19节 最短子数组练习题

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

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

测试样例:
[1,4,6,5,9,10],6

返回:2


Java (javac 1.7)
代码自动补全

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

}


您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: