滑动窗口类型题
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 }
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号