滑动窗口类型题
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了