力扣560.和为k的子数组

560. 和为 K 的子数组 - 力扣(LeetCode)

简单枚举:

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


            for(int j = i ; j < nums.length ;j ++){
                sum += nums[j];

                if(sum == k){count ++;}
            }
        }
        return count;
    }
}

同理也可以从右往左看来解答(方法二需要这个角度来解答)

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

即:

以 i 结尾和为 k 的连续子数组个数,我们需要统计符合条件的下标 j 的个数


我们可以基于上述方法利用数据结构进行进一步的优化

方法一的瓶颈:

在于对每个 i,我们需要枚举所有的 j 来判断是否符合条件(从右往左的方法一答案版本中的i、j)

前缀和 + 哈希表优化

求以 i 结尾的和为 k 的连续子数组个数

只要统计有多少个前缀和为 prei−k 的 prej 即可

前缀和:eg.第i个数的前缀和即第一个数到第i个数相加

java 复制代码
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0, pre = 0;

        // map:key = 前缀和的值,value = 这个前缀和出现过多少次
        HashMap < Integer, Integer > mp = new HashMap < > ();

        // 初始化:前缀和=0 出现1次        
        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;
    }
}

难点解析:

java 复制代码
            if (mp.containsKey(pre - k)) {
                count += mp.get(pre - k);
            }
            mp.put(pre, mp.getOrDefault(pre, 0) + 1);

pre - k:

pre - k 为啥是key,感觉是value更合适吧

重申:HashMap<前缀和数值, 这个前缀和出现过多少次>

pre - k不存在为啥pre存map?

map 的作用:存下当前这个前缀和,给后面的元素去查

所以put没放在else里边:二者不沾边

相关推荐
D e re k ZH30 分钟前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi1 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
東隅已逝,桑榆非晚4 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom4 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java6665 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐5 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮5 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers6 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
文丑颜不良啊6 小时前
LeetCode2081~2100题目解析
java·leetcode