[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 ...
随机推荐
- 智能车学习(二)—— GPIO学习
一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...
- 对于Eclipse的正确用法
有时候我们刚刚修改了工程里的文件 但是启动的时候它硬是说你有东西没有声明 而那个东西又明明在那里.. 这时候我们可以认为实际与它调用的工程关系文件(我假想的) 不同步.. 我们可以通过clean功能来 ...
- POJ 1182 食物链 (经典带权并查集)
第三次复习了,最经典的并查集 题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们 ...
- LoadRunner关联函数的脚本实例--如何操作关联参数
LoadRunner关联函数的脚本实例--如何操作关联参数 这几天一直在学习LoadRunner的VuGen编程,今天想对关联函数web_reg_save_param做详细的试验和研究: ~f6p q ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分
[题目分析] 上次用树状数组套主席树做的,这次用整体二分去水. 把所有的查询的结果一起进行二分,思路很好. [代码] #include <cstdio> #include <cstr ...
- SQL ISNULL 函数
sql 中 NULL 值的处理:微软的 ISNULL() 函数用于规定如何处理 NULL 值.NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果.语法ISNULL ( ...
- jquery笔记(基础知识)
最近在学jquery,做点小笔记 语法: $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有 <p> 元素 $("p . ...
- Spring Integration - 自动轮询发送手机短信
Spring Integration 配置 <?xml version="1.0" encoding="UTF-8"?> <beans xml ...
- ajax 异步交互
<script> $(function(){ $("#sub").click(function () { $.ajax( ...
- XAML Region标签功能
XAML本身没有Region标签功能,很郁闷.现在有插件可以实现该功能了! <!-- Region (Any Text You Want) --> Your Code <!-- ...