题目
581. Shortest Unsorted Continuous Subarray
解题思路
题目要求找出最短连续需要排序的数字长度。
别人的思路:
二层遍历,第二层data[j]小于第一层data[i],则记下 j 和 i,当然最后是要取最大的 j 和最小的 i。
我的思路是
-
如果数字长度<= 1,一定不用排序,返回0
-
长度>1,从第2位数字开始遍历,找到比前一位nums[i-1]大的数字nums[i],初始化第一个需要排序的下标begin=-1,比nums[i]大的数字下标为is_larger=-1:
-
从i - 2开始往前遍历到0,如果遇到比nums[i]大的数字,记下is_larger = 该数字下标,如果遍历结束后:
-
没有出现比nums[i]大的数字且 begin == -1:
begin = i - 1
-
有出现比nums[i]大的数字:
-
如果begin > is_larger 或 begin == -1:
begin = is_larger
-
-
-
具体代码
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
if (nums.size() <= 1) return 0;
int size = nums.size();
int begin = -1, end = -2;
int max_index = 0;
for (int i = 1; i < size; i++) {
if (nums[i] < nums[i-1]) {
end = i;
int t_begin = i - 1;
int is_larger = -1;
for (int j = i - 2; j >= 0; j--) {
if (nums[j] > nums[i]) {
is_larger = j;
}
}
if (is_larger != -1)
t_begin = is_larger;
if (begin > t_begin || begin == -1)
begin = t_begin;
} else {
if (nums[i] >= nums[max_index])
max_index = i;
else {
end = i;
}
}
}
return end - begin + 1;
}
};