📅  最后修改于: 2023-12-03 15:26:28.096000             🧑  作者: Mango
给定一个整数数组,编写一个函数来查找其中需要排序的最短子数组的长度。
例如,给定 [2, 6, 4, 8, 10, 9, 15],输出 5,因为需要将子数组 [6, 4, 8, 10, 9] 进行排序,使得整个数组排序。
在一个无序数组中,只要该数组从左到右呈现递增趋势,就说这个数组的左边是有序的。同样的,只要该数组从右到左呈现递增趋势,就说这个数组的右边是有序的。
根据这个思路,我们可以通过寻找左边无序区域的最大值和右边无序区域的最小值,来确定最短无序子数组的长度。
具体方法如下:
下面是该问题的 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。