[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 ...
随机推荐
- .deb文件打包
最近因项目需要,需要把文件夹打包为.deb格式的包,幸亏一位朋友帮忙指导了我一个晚上,才得以完成,这里再次对他表示感谢. 整理打包流程如下: 请先参考此博客内容,了解deb文件打包 如何制作Deb包和 ...
- 【译】安装Sonar要求
本文仅为本人看sonar官方文档时,因其为英文,故简单整理翻译[英语不好,见谅!] http://docs.sonarqube.org/display/SONAR/Requirements 目录 ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- java中的负数的问题
在计算机中是使用二制数中的最高位表示来正负. 二进制的储存中都是用的补码,正数的原码.反码和补码相同,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1(重要!!) 首先得知道最高 ...
- cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备
一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x G ...
- SSH框架应用解析
一.什么是SSH SSH 不仅仅只是一个框架,而是由多个框架集成而来,是 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架,结构清晰.可复用性好. ...
- java基本数据类型及相互间的转换
1.首先复习一下java的基本数据类型,见下图 2.比较他们的字节数 备注:1字节(Byte)=8位(Bit) 3.转换中的知识点 *java中整数类型默认的int类型:小数类型默认的double: ...
- BurpSuite的使用总结
BurpSuite BurpSuite 是一款使用Java编写的,用于Web安全审计与扫描套件.它集成了诸多实用的小工具以完成http请求的转发/修改/扫描等,同时这些小工具之间还可以 互相协作,在B ...
- node body-parser
var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // p ...
- eclipse下Android无法自动生成apk文件怎么办?
eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...