【题目】
给定一个无序数组 arr, 求出需要排序的最短子数组长度。例如,arr = [1, 5, 3, 4, 2, 6, 7] 返回 4,因为只有 [5, 3, 4, 2] 需要排序。
【要求】
若数组 arr 的长度为 N,则要求时间复杂度为 O(N), 额外空间复杂度为 O(1)
【难度】
一星
【解答】
- 首先从左到右进行遍历,获取需要调整的最大索引位置 rightIndex, 初始值为 -1 。使用变量 max 记录 arr[i] 左边的最大值,初始值为 arr[0]。若 arr[i] 的左边存在一个数大于 arr[i], 即 max > arr[i], 则 i 位置为需要调整的位置。若遍历后 rightIndex == -1, 说明不需要调整,直接返回 0。
- 然后从右到左进行遍历,获取需要调整的最小索引位置 leftIndex,初始值为 -1 。使用变量 min 记录 arr[i] 右边的最小值,初始值为 arr[arr.length-1]。若 arr[i] 的右边存在一个数小于 arr[i], 即 min < arr[i], 则 i 位置为需要调整的位置。
- 最后需要调整的长度 res = rightIndex - leftIndex + 1
具体实现过程请参考如下代码中的 getMinLength 方法.
1 public class Main { 2 3 public static void main(String[] args) { 4 int[] arr1 = {1,5,3,4,2,6,7}; 5 System.out.println(new Main().getMinLength(arr1));//4 6 7 int[] arr2 = {1,2,3,4,5,6,7}; 8 System.out.println(new Main().getMinLength(arr2));//0 9 10 int[] arr3 = {7,2,3,4,5,6,7}; 11 System.out.println(new Main().getMinLength(arr3));//7 12 } 13 14 public int getMinLength(int[] arr){ 15 if(arr == null || arr.length < 2) return 0; 16 int len = arr.length; 17 int rightIndex = -1; 18 int max = arr[0]; 19 //从左到右遍历 20 for(int i = 1; i < len; i++){ 21 if(max > arr[i]){//若 arr[i]的左边存在一个数大于 arr[i], 即 max > arr[i], 则 i 位置为需要调整的位置 22 rightIndex = i; 23 }else{//若 arr[i] >= max, 则设置 max = arr[i] 24 max = arr[i]; 25 } 26 } 27 if(rightIndex == -1){//若数组不需要调整, 则返回 0 28 return 0; 29 } 30 //从右向左遍历 31 int leftIndex = -1; 32 int min = arr[len-1]; 33 for(int i = len-1; i > -1; i--){ 34 if(min < arr[i]){//若 arr[i] 的右边存在一个数小于 arr[i], 即 min < arr[i], 则 i 位置为需要调整的位置 35 leftIndex = i; 36 }else{//若 arr[i] <= min, 则设置 min = arr[i] 37 min = arr[i]; 38 } 39 } 40 return rightIndex - leftIndex + 1; 41 } 42 43 }