数组面试题 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

高频面试题:部分排序

面试题:数字在排序数组中出现的次数

LeetCode面试题 10.01. 合并排序的数组(C++)

面试题 10.01.合并排序的数组

剑指Offer面试题53 - I. 在排序数组中查找数字 I