数组和矩阵问题:需要排序的最短子数组长度

题目

  给定一个无序数组 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 }

猜你喜欢

转载自www.cnblogs.com/zlxyt/p/10527781.html