Leetcode:最短无序连续子数组
排序+比较O(nlogn)O(nlogn)O(nlogn)
排序+比较
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
if (is_sorted(nums.begin(), nums.end()))
{
return 0;
}
vector<int> f = nums;
sort(f.begin(), f.end());
int l = 0, r = f.size() - 1;
while (f[l] == nums[l]) l ++ ;
while (f[r] == nums[r]) r -- ;
return r - l + 1;
}
};
查找O(n)O(n)O(n)
乱序的那一段里面,最后一个元素一定不是最大的,否则属于后面正序的那一段
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int maxn = INT_MIN, r = -1;
int minn = INT_MAX, l = -1;
int n = nums.size();
for (int i = 0; i < n; i ++ )
{
if (maxn > nums[i]){
r = i;
}
else {
maxn = nums[i];
}
if (minn < nums[n - i - 1]){
l = n - i - 1;
}
else {
minn = nums[n - i - 1];
}
}
return r == -1 ? 0 : r - l + 1;
}
};
解码
模拟
判断一下奇偶性,模拟就好
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
char s[2010];
string str;
int main()
{
cin >> n;
cin >> str;
bool flag = (n & 1);
if (flag)
{
int l = n / 2, r = n / 2 + 2;
s[n / 2 + 1] = str[0];
int j = 1;
n -- ;
while (n)
{
s[l -- ] = str[j ++ ];
s[r ++ ] = str[j ++ ];
n -= 2;
}
printf("%s\n", s + 1);
}
else
{
int l = n / 2, r = n / 2 + 1;
int j = 0;
while (n)
{
s[l -- ] = str[j ++ ];
s[r ++ ] = str[j ++ ];
n -= 2;
}
printf("%s\n", s + 1);
}
return 0;
}
本文提供两种解决LeetCode上最短无序连续子数组问题的方法:一种利用排序与比较实现O(nlogn)的时间复杂度;另一种通过查找乱序区间边界达到O(n)的时间复杂度。此外,还附带一个模拟解码的小程序。
7941

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



