Sub Sort: 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).
|
|
Hints: #482, #553, #667, #708, #735, #746
解法
先观察例子:
|
|
观察发现:
- 区间左边是有序的
- 区间右边是有序的
- 区间里的最小值大于左边的最大值
- 区间里的最大值小于右边的最小值
这个问题肯定不是排序问题,也不可能让你试遍所有可能性来找这个最小区间。
先来看怎么找m:
- 从左侧开始遍历,只要当前元素比前一个元素大,那么说明在升序中
- 当碰到当前元素 < 前一个元素小时,意味着遇到了降序,此时就要开始找之后遇到的最小元素是什么
- 遍历结束之后,再找这个最小元素应该插入到哪个位置,即第一个比它大的数所在的位置,这个位置就是m
|
|
再来看怎么找n:
- 从右侧开始找,只要当前元素比后一个元素小,说明在降序中
- 当碰到当前元素 > 前一个元素时,意味着遇到了升序,此时就要开始找之后遇到的最大的元素是什么
- 遍历结束之后,找这个最大元素应该插入到哪个位置,即第一个比它小的数所在的位置,这个位置就是n
|
|
代码:
|
|
评论