美文网首页
长度最小的子数组

长度最小的子数组

作者: 147258_d8b2 | 来源:发表于2020-06-29 13:05 被阅读0次

    给定一个含有 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
    }
    

    相关文章

      网友评论

          本文标题:长度最小的子数组

          本文链接:https://www.haomeiwen.com/subject/rasofktx.html