📜  最短无序子数组的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:26:28.096000             🧑  作者: Mango

最短无序子数组的 C++ 程序介绍

简介

给定一个整数数组,编写一个函数来查找其中需要排序的最短子数组的长度。

例如,给定 [2, 6, 4, 8, 10, 9, 15],输出 5,因为需要将子数组 [6, 4, 8, 10, 9] 进行排序,使得整个数组排序。

解题思路

在一个无序数组中,只要该数组从左到右呈现递增趋势,就说这个数组的左边是有序的。同样的,只要该数组从右到左呈现递增趋势,就说这个数组的右边是有序的。

根据这个思路,我们可以通过寻找左边无序区域的最大值和右边无序区域的最小值,来确定最短无序子数组的长度。

具体方法如下:

  1. 从左到右遍历整个数组,判断当前数值是否大于左边已遍历数值中的最大值,若大于则将该数值标记为右边无序区域的右边界;
  2. 从右到左遍历整个数组,判断当前数值是否小于右边已遍历数值中的最小值,若小于则将该数值标记为左边无序区域的左边界;
  3. 计算左边无序区域和右边无序区域之间的距离,即为最短无序子数组的长度。
代码实现

下面是该问题的 C++ 实现代码:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int left = nums.size(), right = 0;
        int max = nums[0], min = nums[nums.size() - 1];

        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] < max) right = i;
            else max = nums[i];

            if (nums[nums.size() - i - 1] > min) left = nums.size() - i - 1;
            else min = nums[nums.size() - i - 1];
        }

        return (right > left) ? right - left + 1 : 0;
    }
};

其中,left 和 right 分别记录左边无序区域的左边界和右边无序区域的右边界。初始时,将 left 设置为整个数组长度,right 设置为 0。

接着,从左到右遍历整个数组,如果当前数值小于左边已遍历数值中的最大值,则将该数值标记为右边无序区域的右边界。如果当前数值大于左边已遍历数值中的最大值,则更新最大值为该数值。

然后,从右到左遍历整个数组,判断当前数值是否小于右边已遍历数值中的最小值,若小于则将该数值标记为左边无序区域的左边界。同样的,如果当前数值大于右边已遍历数值中的最小值,则更新最小值为该数值。

最后,判断 left 和 right 的值是否合法,若合法,则返回无序区间长度 right - left + 1,否则返回 0。