数组面试题 16.16. 部分排序
Posted ocpc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组面试题 16.16. 部分排序相关的知识,希望对你有一定的参考价值。
题目:
解答:
默认升序(降序也只是改一点代码,不影响)
原理:如果左侧最大值大于中间的最小值,则一定会被中间序列包括;同理,如果右侧最小值大于中间的最大值,则一定会被中间序列包括。
一遍遍历 + 两个指针(两次扫描可一次遍历完成)
1、从前向后扫描数组,判断当前array[i]是否比max小,是则将last置为当前array下标i,否则更新max;
2、从后向前扫描数组,判断当前array[len - 1 - i]是否比min大,是则将first置位当前下标len - 1 - i,否则更新min;
3、返回{first, last}
1 class Solution { 2 public: 3 vector<int> subSort(vector<int>& array) 4 { 5 if (array.size() == 0) 6 { 7 return {-1, -1}; 8 } 9 10 int last = -1; 11 int first = -1; 12 13 int max = INT_MIN; 14 int min = INT_MAX; 15 16 int len = array.size(); 17 18 for (int i = 0; i < len; i++) 19 { 20 if (array[i] < max) 21 { 22 last = i; 23 } 24 else 25 { 26 max = std::max(max, array[i]); 27 } 28 29 if (array[len - 1 -i] > min) 30 { 31 first = len - 1 - i; 32 } 33 else 34 { 35 min = std::min(min, array[len - 1 - i]); 36 } 37 } 38 39 return {first, last}; 40 } 41 };
以上是关于数组面试题 16.16. 部分排序的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—面试题 16.16. 部分排序(排序)—day58