leetcode 581. 最短无序连续子数组

题目描述

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。

示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :

  1. 输入的数组长度范围在 [1, 10,000]。
  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。

题解

遍历数组,同时进行从头到尾,从尾到头的遍历,分别找出无序连续子数组区间的右边和左边节点;右边点,是从左到右不递增的点,左边点,是从右到左不递减的点,两点之间的距离就是所求值

示例代码(go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func findUnsortedSubarray(nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
start, end := n-1, 0
max, min := nums[0], nums[n-1]

for i := 0; i < n; i++ {
if nums[i] >= max {
max= nums[i]
} else {
end = i
}

if nums[n-i-1] <= min {
min = nums[n-i-1]
} else {
start = n-i-1
}
}

if start >= end {
return 0
}

return end-start+1
}