day07 和为 K 的子数组

1、和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k的子数组的个数

子数组是数组中元素的连续非空序列。

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int n = nums.length;
        int count = 0;
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i; j >= 0; j--) {
                sum += nums[j];
                if (sum == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

方法的瓶颈在于对每个 i,我们需要枚举所有的 j 来判断是否符合条件,我们定义 prei0..i 里所有数的和,prei=prei−1+numsi,那么「j..i 这个子数组和为 k 」这个条件我们可以转化为

prei−prej−1==k

简单移项可得符合条件的下标 j 需要满足

prej−1==prei−k

java 复制代码
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0, pre = 0;
        HashMap < Integer, Integer > mp = new HashMap < > ();
        mp.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];
            if (mp.containsKey(pre - k)) {
                count += mp.get(pre - k);
            }
            mp.put(pre, mp.getOrDefault(pre, 0) + 1);
        }
        return count;
    }
}
相关推荐
WBluuue6 小时前
数据结构与算法:有序表(二):跳表
数据结构·c++·算法·skiplist
不好听6137 小时前
深入理解链表:线性数据结构的另一面
javascript·数据结构
Queenie_Charlie8 小时前
哈夫曼树
数据结构·c++·哈夫曼树
Shan120510 小时前
经典问题——验证栈序列
数据结构·算法
漂流瓶jz12 小时前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Chen_harmony12 小时前
二、顺序表
数据结构
BAGAE13 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
h_a_o777oah13 小时前
【算法专项】扩展域并查集:原理详解及解决大部分种类并查集问题(洛谷P5937 P2024 C++代码)
数据结构·c++·算法·acm·并查集·扩展域·逻辑建模
吴阿福|一人公司14 小时前
深度解析 Python 类变量修改的命名空间隔离
java·服务器·数据结构
不知名的老吴14 小时前
经典算法题之行星碰撞
数据结构·算法