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


    题目

      给定一个无序数组 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 }
  • 相关阅读:
    UISegmentedControl分段控件
    手势识别器
    delegate代理设计模式
    target/action设计模式
    响应者链
    事件处理
    屏幕旋转
    混编ObjectiveC++
    AES128加密
    您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10527781.html
Copyright © 2020-2023  润新知