【算法题】重新排序的最短子数组
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 ; }
相关文章推荐
- 算法--求需要排序的最短子数组问题
- 百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
- [算法]需要排序的最短子数组长度
- LintCode2016年8月22日算法比赛----将数组重新排序以构造最小值
- C#中定义数组和一个简单排序算法实现。
- 常用算法_数组排序Test1
- 急,数组1排序后->数组2,求算法!3Q
- 编写一个js函数求一个字符串数组按字符串中各字母出现次数多少的重新排序
- 两个已排序的整型数组,求交集,最快算法
- [算法]_[对数组内的数字进行从小到大排序]
- PHP中数组元素升序、降序及重新排序的函数
- 算法题 -- 合并两个大小为n的已排序数组
- 一到关于数组排序的算法题
- 【慢慢学算法】:数组排序(一题多做)
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- php不用内置函数对数组排序的两个算法代码
- 小根堆对数组排序C语言算法实现
- 以行为单位对字符串变量下标为奇数位置上的字符按其ASCii值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中
- C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序