随笔 - 14  文章 - 0  评论 - 1  阅读 - 13793

滑动窗口类型题

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   啊哈好223  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示