题目链接:最短无序连续子数组
2021年8月3日 星期二
思路
如果将之间某段重新排序可以得到递增的序列,那么我们假设这三段分别为abc
所以ac显然是有序的,那么我们排序以后,用前指针找到左端点,后指针找到右端点即可。
tips:两个端点肯定不同,因为如果两个端点一样的话,说明这个区间只有一个值,那么对一个元素排序与否肯定不会有影响
所以两个端点是成对出现的
cpp
/*
**by 小染
**2021年8月3日 星期二 14:37
*/
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
vector<int> t(nums);
sort(t.begin(),t.end());
int l=1,r=0;//之所以这样赋值 是为了防止后面没有找到端点
bool flag=false;//判断一下左端点出现没有
for(int i=0;i<nums.size();i++){
if(t[i]!=nums[i]){
l=i;
flag=!flag;
break;
}
}
if(flag){
for(int i=nums.size()-1;i>=0;i--){
if(t[i]!=nums[i]){
r=i;
break;
}
}
}
return r-l+1;
}
};
java
/*
**by 小染
**2021年8月3日 星期二 14:44
*/
class Solution {
public int findUnsortedSubarray(int[] nums) {
int [] t=nums.clone();
Arrays.sort(t);
int len=nums.length;
int l=1,r=0;//之所以这样赋值 是为了防止后面没有找到端点
boolean flag=false;//判断一下左端点出现没有
for(int i=0;i<len;i++){
if(t[i]!=nums[i]){
l=i;
flag=!flag;
break;
}
}
if(flag){
for(int i=len-1;i>=0;i--){
if(t[i]!=nums[i]){
r=i;
break;
}
}
}
return r-l+1;
}
}
python
/*
**by 小染
**2021年8月3日 星期二 16:06
*/
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
n=len(nums)
temp_nums=sorted(nums)
l=0
r=n-1
while l < len(nums):
if nums[l] != temp_nums[l]:
break
l += 1
if l == len(nums):
return 0
while r > l:
if nums[r] != temp_nums[r]:
break
r -= 1
return r - l + 1```