滑动窗口类型题

1.来自力扣

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和≥ target的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

以下是go语言代码:
func minSubArrayLen(target int, nums []int) int {
    length := len(nums)
    l,r := 0, 0  // l和r表示左右的两个指针
    sum,ret := 0, math.MaxInt64

    for r = 0;r<length;r++ {
        sum += nums[r]
     // 判断是否大于指定的值,如果大于则减去左边的值,然后l+1,其中要存储子数组的长度,r-l+1
        for sum >= target {
            ret = min(ret, r-l+1)
            sum -= nums[l]
            l++
        }
    }
    if ret >= math.MaxInt64 {
        return 0
    }
    return ret
}

 

930. 和相同的二元子数组

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 非空 子数组。

子数组 是数组的一段连续部分。

 

示例 1:

输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]

func numSubarraysWithSum(nums []int, goal int) int {
   cnt := map[int]int{}
   sum := 0
   ans := 0

   for _, v := range nums {
       cnt[sum]++
       sum += v
       ans += cnt[sum-goal]
   }
    return ans
}
func numSubarraysWithSum(nums []int, goal int) (ans int) {
    left1, left2 := 0, 0
    sum1, sum2 := 0, 0
    for right, num := range nums {
        sum1 += num
        for left1 <= right && sum1 > goal {
            sum1 -= nums[left1]
            left1++
        }
        sum2 += num
        for left2 <= right && sum2 >= goal {
            sum2 -= nums[left2]
            left2++
        }
        ans += left2 - left1
    }
    return
}

 

posted on 2022-01-15 17:39  啊哈好223  阅读(31)  评论(0)    收藏  举报