【LeetCode精选算法】前缀和专题二

目录

[29. 和为k的子数组(medium)](#29. 和为k的子数组(medium))

[30. 和可被K整除的子数组(medium)](#30. 和可被K整除的子数组(medium))

[31. 连续数组(medium)](#31. 连续数组(medium))

[32. 矩阵区域和(medium)](#32. 矩阵区域和(medium))


29. 和为k的子数组(medium)

题目链接

解题思路

使用哈希表记录前缀和出现的次数。遍历数组,计算当前前缀和 sum,若 sum - k 在哈希表中存在,则累加其出现次数。

Java 代码

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        hash.put(0, 1);
        int sum = 0, ret = 0;
        for (int x : nums) {
            sum += x;
            ret += hash.getOrDefault(sum - k, 0);
            hash.put(sum, hash.getOrDefault(sum, 0) + 1);
        }
        return ret;
    }
}

30. 和可被K整除的子数组(medium)

题目链接

解题思路

利用同余定理,若 (sum[i] - sum[j]) % K == 0,则 sum[i] % K == sum[j] % K。使用哈希表记录每个余数出现的次数。

Java 代码

java 复制代码
class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        hash.put(0 % k, 1);
        int sum = 0, ret = 0;
        for (int x : nums) {
            sum += x;
            int r = (sum % k + k) % k;
            ret += hash.getOrDefault(r, 0);
            hash.put(r, hash.getOrDefault(r, 0) + 1);
        }
        return ret;
    }
}

31. 连续数组(medium)

题目链接

解题思路

0 视为 -1,问题转化为寻找和为 0 的最长子数组。使用哈希表记录每个前缀和第一次出现的位置。

Java 代码

java 复制代码
class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        hash.put(0 % k, 1);
        int sum = 0, ret = 0;
        for (int x : nums) {
            sum += x;
            int r = (sum % k + k) % k;
            ret += hash.getOrDefault(r, 0);
            hash.put(r, hash.getOrDefault(r, 0) + 1);
        }
        return ret;
    }
}

32. 矩阵区域和(medium)

题目链接

解题思路

使用二维前缀和,对于每个 (i,j),计算其周围 k 范围内的区域和。注意边界处理。

Java 代码

java 复制代码
class Solution {
    public int findMaxLength(int[] nums) {
        Map<Integer, Integer> hash = new HashMap<>();
        hash.put(0, -1);
        int sum = 0, ret = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i] == 0 ? -1 : 1;
            if (hash.containsKey(sum)) {
                ret = Math.max(ret, i - hash.get(sum));
            } else {
                hash.put(sum, i);
            }
        }
        return ret;
    }
}
相关推荐
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅8 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue10 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路11 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星11 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑11 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光12 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩12 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ13 小时前
单词拆分----dp
算法