题目:
给定一个无序数组,求出需要排序的最短子数组的长度。
例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序。
思路:
解决这个问题可以在时间复杂度为O(N)、额外空间复杂度为O(1)完成。
时间复杂度为O(n),快排啥的就已经排除了,这里应用桶排序,将arr中的所有数从min到max分成max-min个桶,当相邻最大的时候,也就是相邻两个之间空桶最多的时候
c++代码如下:
int findMaxDivision(vector<int> &vec)
{
int ans = 0;
int count = 0;
int n = vec.size();
int vecMax = vec[0];
int vecMin = vec[0];
//找到最大值和最小值
for (int i = 1; i < n; i++)
{
if (vec[i] > vecMax)
vecMax = vec[i];
else if (vec[i] < vecMin)
vecMin = vec[i];
}
int bucnum = vecMax - vecMin + 1;
//建立桶
vector<int> bucket(bucnum,0);
for (int i = 0; i < n; i++)
bucket[vec[i] - vecMin]++;
//统计空桶的最大数量,最大的即为相差的最大值
for (int i = 0; i < bucnum; i++)
{
if (bucket[i]==0)
count++;
else if(count>ans)
{
ans = count;
count = 0;
}
}
return ans + 1;
}