题目:https://leetcode.cn/problems/sub-sort-lcci/description/
啊呀,我也看出来规律了。我看出来的规律是 [m,n]
中最小值大于m-1
,[m,n]
中的最大值小于n-1
。然后我就傻傻的按照这个写,嵌套for循环,第一个for循环确定m,第二个for循环找m之后的最大值,然后超时了哈哈🤣
class Solution {
public:
vector<int> subSort(vector<int>& array) {
int len = array.size();
int m = 0, n = len - 1;
for (m = 0; m < len; m++) {
int minx = INT_MAX;
for (int i = m + 1; i < len; i++) {
minx = min(minx, array[i]);
}
if (minx < array[m]) {
break;
}
}
for (n = len-1; n >= m; n--) {
int maxx = INT_MIN;
for (int i = n - 1; i >= m; i--) {
maxx = max(maxx, array[i]);
}
if (maxx > array[n]) {
break;
}
}
if (m >= n) {
m = n = -1;
}
vector<int> ans(2);
ans[0] = m;
ans[1] = n;
return ans;
}
};
看了题解,感觉实在一下子想不到:
- 正序遍历,找最大值,如果比最大值小,下标记为 n
- 倒序遍历,找最小值,如果比最小值大,下标记为 m
class Solution {
public:
vector<int> subSort(vector<int>& array) {
int len = array.size();
int m = -1, n = -1;
int max_v = INT_MIN, min_v = INT_MAX;
for (int i = len - 1; i >= 0; i--) {
if (min_v < array[i]) {
m = i;
}
else {
min_v = array[i];
}
}
for (int i = 0; i < len; i++) {
if (max_v > array[i]) {
n = i;
}
else {
max_v = array[i];
}
}
vector<int> ans(2);
ans[0] = m;
ans[1] = n;
return ans;
}
};