
解题思路
1 排序再比较两个数组,找到不同的元素个数返回即可。
时间复杂度:快速排序O(nlogn)
空间复杂度:O(n)
2 一次遍历,找到左边界和右边界,观察可知,左边界的值大于右边的某一最小值,但是左边界左边的值全部小于等于这个最小值。
即 if(nums[i]>min_val) left=i;
if(nums[i]<=min_val) min_val=nums[i];
同理得到右边界。
假如原数组本来就是升序,那么left=-1;返回0;
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int max_val=INT_MIN,min_val=INT_MAX;
int left=-1,right=-1;
int n=nums.size();
for(int i=0;i<n;++i){
//确认右边界
//从左边开始,右边界的值一定会小于左边的最大值
if(nums[i]<max_val)
right=i;
else
max_val=nums[i];
//确认左边界
//从右边开始,左边界的值一定会大于右边的最小值
if(nums[n-1-i]>min_val)
left=n-1-i;
else
min_val=nums[n-1-i];
}
return left==-1?0:right-left+1;
}
};
该博客讨论了一种算法,用于找出数组中未排序的最小子数组的长度。通过一次遍历,确定左边界和右边界,从而确定不连续子数组。时间复杂度为O(nlogn),空间复杂度为O(n)。适用于数组处理和算法优化场景。
543

被折叠的 条评论
为什么被折叠?



