【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;
    }
}
相关推荐
NAGNIP9 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱18 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub21 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub21 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub21 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub21 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP1 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP1 天前
一文搞懂激活函数!
算法·面试
董董灿是个攻城狮1 天前
AI 视觉连载7:传统 CV 之高斯滤波实战
算法