长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
https://leetcode-cn.com/problems/minimum-size-subarray-sum

滑动窗口:
left 和right滑动,找出所有符合要求的窗口。使用min获取最小窗口

func minSubArrayLen(s int, nums []int) int {
    length := len(nums)
    left := 0
    right := 0
    sum := 0
    number := length
    for i := 0; i < length ; i++{
        sum += nums[i]
    }
    if sum < s {
        return 0
    }
    sum = 0
    for i := 0; right < length ; i++{
        for ;right < length && sum < s; {
            sum += nums[right]
            right++
        }

        for ;sum >= s; {
            number = Min(right-left,number)
            sum -= nums[left]
            left++
        }
    }
    return number
}
func Min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

前缀和加二分法:
实现前缀和,为一个排序好的数组。转化为sum[i] - sum[k] > s ,k-i 的最小值。sum[i] > sum[k] +s 。在sum[i:len] 中使用二分法找到k。就可以计算出k-i

func minSubArrayLen(s int, nums []int) int {
    length := len(nums)
    find := 0
    result := math.MaxInt32
    sums := make([]int,length+1)
    for i := 1; i < length+1 ; i++{
        sums[i] += nums[i-1]+ sums[i-1]
    }

    for i := 1; i <= length; i++{
        find = s+ sums[i-1]
        bound := sort.SearchInts(sums, find)
        fmt.Println(bound)
        if bound <= length {
            result = Min(result, bound - (i - 1))
        }
    }
    if result == math.MaxInt32{
        result = 0
    }
    return result
}
func Min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

你可能感兴趣的:(长度最小的子数组)