【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;
    }
}
相关推荐
源代码•宸2 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
博大世界2 小时前
matlab结构体数组定义
数据结构·算法
Loo国昌2 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain
Zach_yuan3 小时前
面向对象封装线程:用 C++ 封装 pthread
开发语言·c++·算法
安特尼3 小时前
X 推荐算法分析
算法·机器学习·推荐算法
罗湖老棍子5 小时前
强迫症冒险家的任务清单:字典序最小拓扑排序
数据结构·算法·图论·拓扑排序
不穿格子的程序员5 小时前
从零开始写算法——回溯篇4:分割回文串 + N皇后
算法·深度优先·dfs
ScilogyHunter5 小时前
qBI有什么用
算法·qbi
龙山云仓6 小时前
No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理
大数据·人工智能·深度学习·算法·机器学习