>给定一个无序数组arr,求出需要排序的最短子数组长度
>要求∶
-o(N)
>如输入: arr={2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序
import java.util.Arrays;
/**
* 升序情况
* 给定一个无序数组arr,求出需要排序的最短子数组长度
* 要求∶
* -o(N)
* 如输入: arr={2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序
*/
public class case08_需要排序的子数组 {
public static void main(String[] args) {
case08_需要排序的子数组 obj=new case08_需要排序的子数组();
int[] arr=new int[]{2,3,7,4,1,5,6};
int[] res=obj.findSegment(arr,arr.length);
System.out.println(Arrays.toString(res));
}
public static int[] findSegment(int[] arr,int n){
int left=-1;//待排子数组的左区间下标
int right=-1;//待排子数组的右区间下标
int max=arr[0];
int min=arr[n-1];
//找右端点,只要右侧出现比历史最高峰还低的,就将右端点扩展到此处
for(int i=0;i<n;i++){
if(arr[i]>max) {
max = arr[i];
}
if(arr[i]<max){
right=i;
}
}
//找左端点,只要左侧出现比历史最低峰还高,就将左端点扩展到此处
for(int i=n-1;i>=0;i--) {
if(arr[i]<min){
min=arr[i];
}
if(arr[i]>min){
left=i;
}
}
if (left == -1) {
return new int[]{0, 0};
}
return new int[]{left,right};
}
}