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 = 1; i < array.size(); ++i) {if (array[i] < array[i - 1]) {return i - 1;}}return array.size() - 1;
}int find_start_of_right_subsequence(vector<int> array) {for (int i = array.size() - 2; i >= 0; --i) {if (array[i] > array[i + 1]) {return i + 1;}}return 0;
}int shrink_left(vector<int> array, int min_idx, int start) {int cmp = array[min_idx];for (int i = start - 1; i >= 0; --i) {if (array[i] <= cmp) {return i + 1;}}return 0;
}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 - 1;}}return array.size() - 1;
}bool validate(vector<int> array, int left_idx, int right_idx) {vector<int> middle(right_idx - left_idx + 1);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 = 1; i < array.size(); ++i) {if (array[i - 1] > 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() - 1) 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 + 1; 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 All in One 题目汇总

[CareerCup] 17.6 Sort Array 排列数组相关推荐

  1. 【Java】用sort实现对数组的升序和降序排序

    Java 用 sort 实现对数组的升序和降序排序 一.ArrayList 的升序与降序 二.数组升序 三.数组降序 方法一 方法二 一.ArrayList 的升序与降序 升序:Collections ...

  2. [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. 这道题 ...

  3. 【 MATLAB 】sort ( Sort array elements )

    sort Sort array elements Syntax B = sort(A) B = sort(A,dim) B = sort(___,direction) B = sort(___,Nam ...

  4. 【javascript高级教程】JavaScript Array(数组) 对象

    数组对象的作用是:使用单独的变量名来存储一系列的值. 创建数组, 为其赋值: var mycars = new Array(); mycars[0] = "Saab"; mycar ...

  5. JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)...

    数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...

  6. sort() 对数值数组进行升序排序

    实例 对数组 $cars 中的元素按字母进行升序排序: <?php $cars=array("Volvo","BMW","Toyota" ...

  7. 如何重新排列数组使得数组左边为奇数,右边为偶数

    给定一个存放整数的数组,如何重新排列数组使得数组左边为奇数,右边为偶数?要求:空间复杂度为O(1),时间复杂度为O(n); 代码 #include <iostream> using nam ...

  8. LeetCode 905 Sort Array By Parity--Java stream,Python lambda表达式一行 解法

    题目地址:Sort Array By Parity - LeetCode Given an array A of non-negative integers, return an array cons ...

  9. Leetcode PHP题解--D16 922. Sort Array By Parity II

    2019独角兽企业重金招聘Python工程师标准>>> 922. Sort Array By Parity II 题目链接 922. Sort Array By Parity II ...

最新文章

  1. C语言——冒泡法排序应用
  2. tensorflow r1.5 版本差异调研
  3. Android 底部导航栏的简单实现-BottomNavigationView
  4. 一个祸害我很久的东东——事件过滤器之按键触发
  5. cassss服务未启动_冰箱不启动是因为什么?要怎么解决这个问题
  6. Linux如何访问mmio空间,一文读懂Linux下如何访问I/O端口和I/O内存
  7. Myeclipse学习总结(8)——Eclipse实用操作
  8. 第六届中国开源年会(COSCon'21)开心开源精彩收官
  9. firefox浏览器优化-速度超chrome
  10. 去认识一下WCDMA中的SCH信道
  11. install glm library in ubuntu and use it in qt
  12. IronJS与CSScript
  13. 499服务器响应,一边制造,一边讲解http状态码502|504|499|500
  14. mysql强行关闭回滚中的进程_mysql查询正在执行的进程
  15. Kafka的概念与命令操作
  16. RobotFramework笔记一:元素定位
  17. 中文技术文档的写作规范
  18. Pomelo Connection
  19. Python爬取南京地铁微博发布客流数据并进行分析
  20. VS Supercharger插件

热门文章

  1. 保存和加载pytorch模型
  2. FPGA从Xilinx的7系列学起(2)
  3. 数据的存入取出(注册机方式)
  4. python基础学习-装饰器进阶
  5. ssh服务常见问题及其解决办法
  6. 一个简单好用的Android Tab 设计与实现
  7. JavaScript - JavaScript通用表单验证函数(实例)
  8. 符合标准的TreeView实现(Div+CSS+JS+ASP.NET)
  9. 自己动手生成评论RSS
  10. A List Apart 经典文章:突破网格设计的僵局