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;
    }
}
相关推荐
kiracrimson4 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊6 小时前
归并排序之翻转对(hard)
数据结构·算法
白狐_7989 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
Lost of 程序猿14 小时前
.NET 线程安全集合与并发数据结构深度实战:从 lock 到无锁
数据结构·安全·.net
机器学习之心14 小时前
基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
数据结构·算法·matlab·轴承剩余寿命预测·振动信号·bigru-attention
青梅橘子皮15 小时前
优选算法---专题2(滑动窗口)
数据结构·算法
程序猫.15 小时前
双指针问题
java·数据结构·算法
50万马克的面包15 小时前
数据结构:线性表 —— 顺序表与链表完整总结
数据结构·链表
白狐_79815 小时前
408 数据结构|散列表构造题:开放定址法做题套路
数据结构·散列表
runningshark16 小时前
CH-6图论基础-有向树
数据结构