【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;
    }
}
相关推荐
倒头就睡的小比特18 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!18 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼19 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光20 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark20 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her121 小时前
并查集-听课笔记
笔记·算法·并查集
码流子21 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven21 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark21 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186121 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法