[leetcode 前缀和]

525. 连续数组 M

:::details

给定一个二进制数组 nums , 找到含有相同数量的 01 的最长连续子数组,并返回该子数组的长度。

示例 1:

复制代码
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

复制代码
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1

解题思路

因为只会出现0或1,求相同数量的最长连续子数组,所以为了方便,我们把0定义为-1,当前缀和等于0时,说明,当前子数组的01相等。

go 复制代码
func findMaxLength(nums []int) (maxLength int) {
	n := len(nums)
	/**
	记录前缀和出现的下标
	*/
	hash := map[int]int{0: -1}
	k := 0
	for i := 0; i < n; i++ {
		if nums[i] == 0 {
			k--
		} else {
			k++
		}
		if prevIndex, ok := hash[k]; ok {
			maxLength = max(maxLength, i-prevIndex)
		} else {
			hash[k] = i
		}
	}
	return maxLength
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

:::

523. 连续的子数组和 - 力扣(LeetCode)M

:::details

给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:

子数组大小 至少为 2 ,且

子数组元素总和为 k 的倍数。

如果存在,返回 true ;否则,返回 false 。

如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。

示例 1:

输入:nums = 23,2,4,6,7, k = 6

输出:true

解释:2,4 是一个大小为 2 的子数组,并且和为 6 。

示例 2:

输入:nums = 23,2,6,4,7, k = 6

输出:true

解释:23, 2, 6, 4, 7 是大小为 5 的子数组,并且和为 42 。

42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。

示例 3:

输入:nums = 23,2,6,4,7, k = 13

输出:false

提示:

1 <= nums.length <= 105

0 <= numsi <= 109

0 <= sum(numsi) <= 231 - 1

1 <= k <= 231 - 1

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/continuous-subarray-sum

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

因为题目要求的是子数组元素总和是k的倍数,也就是说,需要取模运算。

所以,在求前缀和的时候,直接求余数,当出现相同余数的时候,说明当前子数组的前缀和符合倍数要求,然后判断子数组长度,如果符合条件则直接返回。

go 复制代码
func checkSubarraySum(nums []int, k int) bool {
	n := len(nums)
	if n < 2 {
		return false
	}
	/**
	规定空的前缀的结束下标为 -1,
	由于空的前缀的元素和为 0,因此在哈希表中存入键值对 (0,-1)。
	*/
	prevSum := map[int]int{0: -1}
	remainder := 0

	for i, num := range nums {
		remainder = (remainder + num) % k

		if prevIndex, ok := prevSum[remainder]; ok {
			if i-prevIndex >= 2 {
				return true
			}
		} else {
			prevSum[remainder] = i
		}
	}
	return false

}

:::

相关推荐
BothSavage6 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn6 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽8 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法