最短子数组

来源:互联网 发布:linux ioremap 编辑:程序博客网 时间:2024/06/01 20:55


题目:

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

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

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

1.给定一个无序数组,求出需要排序的最短子数组的长度。

例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序

思路:时间复杂度为O(N)、额外空间复杂度为O(1)完成。

从左到右遍历,max记录遍历过的最大值,关注max>当前值的情况(max>a[k]说明k至少要移动到max位置或者更右的位置。记录下发生上述情况最右的位置即可,比如{1,5,3,4,2,6,7},最右位置应该是max=5时出现的IndexRight=4(值为2){1,5,3,4,2,6,57}应该是max=6时出现的right=6(值为5).

从右向左遍历,min记录遍历过的最小值,关注min<当前值的情况(min<a[k])说明k至少要移动到min位置或者更左的位置。记录下发生上述情况最左的位置即可,比如{1,5,3,4,2,6,7},最右位置应该是min=5时出现的IndexLeft=2(值为5)

  接下来从左向右遍历,遍历的过程记录左侧出现过的数的最大值。记为max。假设当前数为arr[i],如果arr[i]

public class Subsequence {    public int shortestSubsequence(int[] a, int n) {        // write code here        int max=a[0];        int min=a[n-1];        int left=0;        int right=n-1;        for(int k=1;k<n;k++){                        if(max>a[k]){//从左向右开始遍历                               left=k;            }else{                 max=a[k];            }            if(min<a[n-k-1]){//从右向左开始遍历                               right=n-k-1;            }else{                 min=a[n-k-1];            }        }                if(left-right>0) return left-right+1;        else return 0;    }}