给定一个无序数组arr,求出需要排序的最短子数组长度。
例如:arr = [1,5,3,4,2,6,7]
返回4,因为只有[5,3,4,2]需要排序。
分析: 这道题思路在于两次遍历,第一次找到左边是否存在比当前位置大的元素,第二次找到右边是否存在比当前位置元素小的,然后相减
// 两次遍历,时间复杂度为O(N),第一次找到左边是否存在比当前位置大的元素,第二次找到右边是否存在比当前位置元素小的
// 然后相减
int findMinUnsortArray(int *arr, int n){
int begin = n-1, end = 0;
int maxElem = arr[0], minElem = arr[n-1];
for(int i = 0; i < n; i++){
if(maxElem <= arr[i]) maxElem = arr[i]; // 找到左边是否存在比当前位置大的元素
else end = i;
}
for(int i = n-1; i >= 0; i--){
if(minElem < arr[i])begin = i; // 找到右边是否存在比当前位置元素小的。
else minElem = arr[i];
}
return begin < end ? end-begin+1 : 0;
}