LeetCode 面试题 部分排序
题目:给定一个整数数组,编写一个函数,找出索引m、n;将索引区[m,n]的元素排好序,整个数组就是有序的,n-m尽量小,即找出符合条件的最短序列,函数返回值为[m,n];若不存在返回[-1,-1]。
例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
思路:对于元素i,若a[i]左边存在大于a[i]的元素,则a[i]参与排序;若a[i]右边存在小于它的元素,则a[i]也参与排序。故只需要找到最靠右的数,且这个数左边存在大于它的数;找到最靠左的数,且它右边存在比它小的数,则这两个数为所找区间。所以只需要从左到右扫描一遍,用一个变量维护一下最大值就行了,然后反向再遍历一遍,维护一个最小值
代码:
class Soluction {
public:
vector<int> SubSort(vector<int>& array) {
int n = array.size();
int max = INT_MIN, min = INT_MAX;
int l = -1, r = -1;
for (int i = 0; i < n; i++)
{
if (array[i] < max)
{
r = i;
}
else {
max = array[i];
}
}
for (int i = n-1; i >= 0; i--)
{
if (array[i] > min)
{
l = i;
}
else {
min = array[i];
}
}
return (l, r);
}
};