题目:
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。
给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。
(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。
思路:
分别从
左->右:记录最大元素值 比较最大元素值和当前遍历元素的大小 如果 最大值 > 当前元素 记录当前元素下标, 直至数组遍历完成。 —— index1
和
右->左:记录最小元素值 比较最小元素值和当前遍历元素的大小 如果 最小值 < 当前元素 记录当前元素下标, 直至数组遍历完成。 —— index2
最后返回 (index1 - index2 + 1)
注释:如果原数组是有序的 那么返回0即可。
贴代码:
int getMin(int a, int b)
{
return (a < b) ? a : b;
}
int getMax(int a, int b)
{
return (a > b) ? a : b;
}
int shortestSubsequence(vector<int> A, int n) {
int L_R_dx = 0, max = A[0];
int R_L_dx = 0, min = A[n - 1];
for(int i = 1; i < n; ++i)
{
if(max > A[i])
{
L_R_dx = i;
}
max = getMax(max, A[i]);
}
for(int i = n - 2; i >= 0; --i)
{
if(min < A[i])
{
R_L_dx = i;
}
min = getMin(min, A[i]);
}
if (L_R_dx == 0 && R_L_dx == 0)
{
return 0;
}
else
{
return (L_R_dx - R_L_dx + 1);
}
}