leetcode/0581.Shortest-Unsorted-Continuous-Subarray/README.md
Given an integer array nums, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order.
Return the shortest such subarray and output its length.
Example 1:
Input: nums = [2,6,4,8,10,9,15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.
Example 2:
Input: nums = [1,2,3,4]
Output: 0
Example 3:
Input: nums = [1]
Output: 0
Constraints:
1 <= nums.length <= 104105 <= nums[i] <= 105给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。
package leetcode
import "math"
func findUnsortedSubarray(nums []int) int {
n, left, right, minR, maxL, isSort := len(nums), -1, -1, math.MaxInt32, math.MinInt32, false
// left
for i := 1; i < n; i++ {
if nums[i] < nums[i-1] {
isSort = true
}
if isSort {
minR = min(minR, nums[i])
}
}
isSort = false
// right
for i := n - 2; i >= 0; i-- {
if nums[i] > nums[i+1] {
isSort = true
}
if isSort {
maxL = max(maxL, nums[i])
}
}
// minR
for i := 0; i < n; i++ {
if nums[i] > minR {
left = i
break
}
}
// maxL
for i := n - 1; i >= 0; i-- {
if nums[i] < maxL {
right = i
break
}
}
if left == -1 || right == -1 {
return 0
}
return right - left + 1
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}