func findUnsortedSubarray(nums []int) int {
	i, j, max, min := 0, -1, nums[0], nums[len(nums)-1]
	for l, r := 0, len(nums)-1; 0 <= r; l, r = l+1, r-1 {
		max = maxInt(max, nums[l])
		min = minInt(min, nums[r])
		if nums[l] != max {
			j = l // The last num that < max
		}
		if nums[r] != min {
			i = r // The last num that > min
		}
	}
	return j - i + 1
}

func maxInt(x, y int) int {
	if x < y {
		return y
	}
	return x
}

func minInt(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func findUnsortedSubarraySort(nums []int) int {
	n := len(nums)
	sorted := make([]int, n)
	copy(sorted, nums)
	sort.Ints(sorted)
	l, r := 0, n-1
	for ; l < n && nums[l] == sorted[l]; l++ {
	}
	if l == n {
		return 0
	}
	for ; nums[r] == sorted[r]; r-- {
	}
	return r - l + 1
}