website/content.en/ChapterFour/0500~0599/0581.Shortest-Unsorted-Continuous-Subarray.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] <= 105Given an integer array nums, you need to find one continuous subarray such that if you sort this subarray in ascending order, then the whole array will become sorted in ascending order. Please find the shortest subarray that satisfies the requirement and output its length.
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
}