[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 ...
随机推荐
- Accelerating Matlab
Matlab is a very useful programming environment, but it also has many inefficiencies. You might thin ...
- JAVA的容器---List,Map,Set (转)
JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashM ...
- loj 1337
题目链接:http://lightoj.com/volume_showproblem.php?problem=1337 思路:对于搜过的区域进行标记,如果要求的点落在已经搜过的区域,那么直接取出来即可 ...
- UIPopoverController 的使用
#import "ViewController.h" #import "RYColorSelectController.h" #import "RYM ...
- 几种方式实现Javaweb页面跳转
背景: 自己经手的一个java项目要实现带参页面跳转和页面跳转,完成任务后,总结一下自己知道了的几种方式. 实现: 首先我们有两大种方式来实现页面跳转:1.JS(javascript):2 ...
- zookeeper源码分析二FASTLEADER选举算法
如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是"electionAlg",其中1 ...
- 【jQuery 冻结任意行列】冻结任意行和列的jQuery插件
实现原理: 创建多个div,div之间通过css实现层叠,每个div放置当前表格的克隆.例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在 ...
- 【转】Linux终端下 dstat 监控工具
转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品.dstat克服了这 ...
- 编解码-marshalling
JBoss的Marshalling序列化框架,它是JBoss内部使用的序列化框架,Netty提供了Marshalling编码和解码器,方便用户在Netty中使用Marshalling. JBoss M ...
- POJ 3080 后缀数组/KMP
题目链接:http://poj.org/problem?id=3080 题意:给定n个DNA串,求最长公共子串.如果最长公共子串的长度小于3时输出no significant commonalitie ...