对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。
给定一个整数数组A及它的大小n,请返回最短子数组的长度。
/*分析:
* 要排序的最小数组 数组起点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源: