[CareerCup] 17.6 Sort Array 排列数组
17.6 Given an array of integers, write a method to find indices m and n such that if you sorted elements m through n, the entire array would be sorted. Minimize n - m (that is, find the smallest such sequence).
为了更好的理解题意,我们通过一个例子来分析,比如我们有如下的数组:
1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19
那么我们可以按照递增顺序将其分为三个部分:
left: 1, 2, 4, 7, 10, 11
middle: 7, 12
right: 6, 7, 16, 18, 19
只要从左右两端开始往中间搜索即可,遇到不是递增的数字就停止,然后我们要给中间的部分排序,排完序我们看left的最右边的数字是否比middle的最左边的数字小,right的最左边的数字是否比middle的最右边的数字大,如果不是,我们要shift_left和shift_right,向左边,我们再来验证整个数列是否是有序的,如果不是有序的,则说明不存在这样的index,参见代码如下:
int find_end_of_left_subsequence(vector<int> array) {
for (int i = ; i < array.size(); ++i) {
if (array[i] < array[i - ]) {
return i - ;
}
}
return array.size() - ;
}
int find_start_of_right_subsequence(vector<int> array) {
for (int i = array.size() - ; i >= ; --i) {
if (array[i] > array[i + ]) {
return i + ;
}
}
return ;
}
int shrink_left(vector<int> array, int min_idx, int start) {
int cmp = array[min_idx];
for (int i = start - ; i >= ; --i) {
if (array[i] <= cmp) {
return i + ;
}
}
return ;
}
int shrink_right(vector<int> array, int max_idx, int start) {
int cmp = array[max_idx];
for (int i = start; i < array.size(); ++i) {
if (array[i] >= cmp) {
return i - ;
}
}
return array.size() - ;
}
bool validate(vector<int> array, int left_idx, int right_idx) {
vector<int> middle(right_idx - left_idx + );
for (int i = left_idx; i <= right_idx; ++i) {
middle[i - left_idx] = array[i];
}
sort(middle.begin(), middle.end());
for (int i = left_idx; i <= right_idx; ++i) {
array[i] = middle[i - left_idx];
}
for (int i = ; i < array.size(); ++i) {
if (array[i - ] > array[i]) {
return false;
}
}
return true;
}
void find_unsorted_sequence(vector<int> array) {
int end_left = find_end_of_left_subsequence(array);
if (end_left >= array.size() - ) return;
int start_right = find_start_of_right_subsequence(array);
int max_idx = end_left;
int min_idx = start_right;
for (int i = end_left + ; i < start_right; ++i) {
if (array[i] < array[min_idx]) {
min_idx = i;
}
if (array[i] > array[max_idx]) {
max_idx = i;
}
}
int left_idx = shrink_left(array, min_idx, end_left);
int right_idx = shrink_right(array, max_idx, start_right);
if (validate(array, left_idx, right_idx)) {
cout << "True: " << left_idx << " " << right_idx << endl;
} else {
cout << "False: " << left_idx << " " << right_idx << endl;
}
}
[CareerCup] 17.6 Sort Array 排列数组的更多相关文章
- [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
11.2 Write a method to sort an array of strings so that all the anagrams are next to each other. 这道题 ...
- [LeetCode] 922. Sort Array By Parity II 按奇偶排序数组之二
Given an array A of non-negative integers, half of the integers in A are odd, and half of the intege ...
- js运用sort对json 数组进行排序
Array.sort()方法是用来对数组项进行排序的 ,默认情况下是进行升序排列.sort() 方法可以接受一个 方法为参数. sort()排序时每次比较两个数组项都回执行这个参数,并把两个比较的数组 ...
- Javascript中Array(数组)对象常用的几个方法
Javascript中Array数组的几个常用方法 pop() --获取数组中末尾的元素 shift() --获取数组中首位元素 push() --在数组中末尾增加元素 slice() --按照下 ...
- 【LEETCODE】42、922. Sort Array By Parity II
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)
数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:Array(数组) 对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- [转贴]JavaScript中Array(数组)的属性和方法
数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8); var c = new Array("first", &qu ...
- LeetCode 905. Sort Array By Parity
905. Sort Array By Parity Given an array A of non-negative integers, return an array consisting of a ...
随机推荐
- 利用Visual GDB在Visual Studio中进行Android开发
转载请注明http://www.cnblogs.com/adong7639/p/4119467.html 无意中发现了Visual GDB这个工具,可以再Visual Studio中进行Android ...
- 数字信号处理实验(一)——DTFT
1.MATLAB自编绘图函数 function [] = signal_write(X,w,flag) % X:数据 % w:频率向量 magX=abs(X);angX=angle(X); realX ...
- html5 head头标签
桌面端开发中,meta标签通常用来为搜索引擎优化(SEO)及 robots定义页面主题,或者是定义用户浏览器上的cookie:它可以用于鉴别作者,设定页面格式,标注内容提要和关键字:还可以设置页面使其 ...
- T-SQL优化
我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还 ...
- Laravel之Service Container服务容器
managing class dependencies and performing dependency injection. Dependency injection is a fancy phr ...
- json 转化
1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码代码如下: JSONArray array = JSONArray.fromObject(userlist); S ...
- hdu3448 01背包+dfs
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3448 Description 0/1 bag problem should sound f ...
- [BZOJ 2957]楼房重建(THU2013集训)(分块思想)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...
- 贪心 Codeforces Round #288 (Div. 2) B. Anton and currency you all know
题目传送门 /* 题意:从前面找一个数字和末尾数字调换使得变成偶数且为最大 贪心:考虑两种情况:1. 有偶数且比末尾数字大(flag标记):2. 有偶数但都比末尾数字小(x位置标记) 仿照别人写的,再 ...
- Zookeeper 分布式环境搭建
一.前期环境 安装概览 IP Host Name Software 192.168.23.128 ae01 JDK 1.7 192.168.23.129 ae02 JDK 1. ...