LeetCode-581-最短无序连续子数组
思路
第一次看到这个题目,其实无法理解题意,简单说就是找到数组中需要排序的最小连续部分,使得对该部分排序后整个数组都是升序的。其实就是找到从左到右最后一个破坏升序的数以及从右到左最后一个破坏降序的数
- 从左到右循环,记录最大值为 max,若 nums[i] < max, 则表明位置 i 需要调整, 循环结束,记录需要调整的最大位置 i 为 end;
- 从右到左循环,记录最小值为 min, 若 nums[i] > min, 则表明位置 i 需要调整,循环结束,记录需要调整的最小位置 i 为 start。
代码
class Solution {
public int findUnsortedSubarray(int[] nums) {
int n=nums.length;
int max=nums[0],min=nums[n-1];
int start=0,end=-1;//ens=-1,保证没有进行排序时,ends-start+1=0
//从左到右寻找最后一个破坏升序的位置
for(int i=0;i<n;i++){
if(nums[i]<max){
end=i;
}
else{
max=nums[i];
}
}
//从右到左寻找最后一个破坏降序的位置
for(int i=n-1;i>=0;i--){
if(nums[i]>min){
start=i;
}
else{
min=nums[i];
}
}
return end-start+1;
}
public int findUnsortedSubarray(int[] nums) {
int n=nums.length;
int max=nums[0],min=nums[n-1];
int start=n-1,end=0;
for(int i=1;i<n;i++){
if(nums[i]<max){
end=i;
}
else{
max=nums[i];
}
}
for(int i=n-2;i>=0;i--){
if(nums[i]>min){
start=i;
}
else{
min=nums[i];
}
}
if(start-end==n-1)return 0;
return end-start+1;
}
}