您的位置:首页 > 其它

【算法题】重新排序的最短子数组

2017-02-27 20:57 288 查看
/*******************************
给定一个无序数组nums,求出需要重新排序的最短子数组
相似题:寻找数组中元素nums[ii],使得nums[ii]大于左侧所有的值,小于等于右侧的值
***********************************/
/************************
思想:
   1.建立一个一个数组right
   2.后续遍历数组,right[i]保存从ii+1~size-1最小值
   3.从左向右遍历,定义一个leftMax, leftMax表示从0~ii-1最大值
   4.定义标志位数组flag
      如果leftMax<=nums[ii]<<right[ii]  则 flag[ii] = 2;否则 flag[ii]=1;
   5.统计flag数组中连续1的个数最短的长度即是所求值
时间复杂度
   O(n)
空间复杂度
   O(n)
****************************/
int  shortestRearrangeSubArray(vector<int> &nums)
{

int size = nums.size();
if (size < 2)
{
return 0;
}
int *right = new int[size];
int *flag = new int[size];
int rightMin = 65535;
//从右向左遍历,构造right数组
for (int ii = size - 1; ii >= 0; ii--)
{
right[ii] = rightMin;
if (nums[ii] < rightMin)
{
rightMin = nums[ii];
}
}
int leftMax = -65536;
//构造flag数组  此处可以利用right数组,降低空间复杂度
for (int ii = 0; ii < size; ii++)
{
if (leftMax <= nums[ii] && nums[ii] <= right[ii])
{
flag[ii] = 2;
}
else
{
flag[ii] = 1;
}
if (leftMax < nums[ii])
{
leftMax = nums[ii];
}
}
int minLen = 65535;
int countLen = 0;
//寻找最短序列
for (int ii = 0; ii < size; ii++)
{
if (flag[ii] == 1)
{
while (ii<size && flag[ii]==1)
{
++countLen;
++ii;
}
if (minLen>countLen)
{
minLen = countLen;

}
countLen = 0;
}
}
delete[] flag;
delete[] right;
return minLen ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: