最短排序

来源:互联网 发布:软件工程硕士大学排名 编辑:程序博客网 时间:2024/05/10 15:31

对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。

给定一个整数数组A及它的大小n,请返回最短子数组的长度。

测试样例:
[1,5,3,4,2,6,7],7
返回:4
方法一:

 /*分析:

    * 要排序的最小数组 数组起点start 数组终点end

    * 如果一个数组是有序的依次遍历数组 后一个永远大于前一个 单调递增

    * [i,n-1) 如果A[i]>A[i+1] 说明单调性发生变化 得到数组起点start = i

    * [n-1,0)如果A[i]<A[i-1] 得到数组end=i

    * 从[start,end]中得到最小值min 最大值max

    * [0,N] A[i]>min 得到start 

    * [N,0] A[i]<max 得到end*/

    public int findShortest(int[] A, int n) {

        int start = 0;

        int end = 0;

        for (int i = 0; i < n-1; i++) {

            if (A[i]>A[i+1]){

                start = i;

                break;

            }

        }

        for (int i = n-1; i >0 ; i--) {

            if (A[i]<A[i-1]){

                end = i;

                break;

            }

        }

        int min = Integer.MAX_VALUE;

        int max = Integer.MIN_VALUE;

        for (int i = start; i <=end ; i++) {

            min = min>A[i]?A[i]:min;

            max = max<A[i]?A[i]:max;

        }

        for (int i = 0; i < n; i++) {

            if (A[i]>min){

                start = i;

                break;

            }

        }

        for (int i = n-1; i >=0; i--) {

            if (A[i]<max){

                end = i;

                break;

            }

        }

        return end - start +1;

    }

方法二:

 public int findShortest(int[] A, int n) {

                 int start = 0;
 int end = 0;

int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i=0;i<n;i++){/*get right*/
if(A[i]<max){  //如果当前值小于前面的最大值 说明当前值在要调整的序列中 更新要调整序列的右值
end=i;
}else{            //如果不大与前面的最大值 更新前面的最大值
max = A[i];
}
 }
for(int i=n-1;i>0;i--){/*get left*/
if(A[i]>min){     //如果当前值大于后面的最小值 说明当前值在要调整的序列中 更新要调整序列的左值
start=i;
}else{
min = A[i]; //如果不小与后面的最小值 更新后面的最小值
}
 }
 if(start==end){
              return 0;
          }
return end-start+1;
    }

题目来http://www.nowcoder.com/practice/a6926700bd424820bd73777f1cb2ef60?rp=2&ru=/activity/oj&qru=/ta/2016test/question-ranking源:

0 0
原创粉丝点击