【Hot100】LeetCode—560. 和为 K 的子数组

目录

  • [1- 思路](#1- 思路)
  • [2- 实现](#2- 实现)
    • [⭐560. 和为 K 的子数组------题解思路](#⭐560. 和为 K 的子数组——题解思路)
  • [3- ACM 实现](#3- ACM 实现)


1- 思路

前缀和

  • ① 借助 HashMap 存储前缀和:Key 为对应的前缀和,Value 为对应的出现次数
    • hm 初始化放入 (0,1) 代表和为 0 的情况出现 1
  • ② 定义 pre 求解前缀和
  • ③ 遍历数组

问题转换

  • 利用前缀和的特性,求 [i..j] 中的元素和,相当于数组和
    • 想要求 [j..i] 区间的和相当于利用 prefixSum[i] - prefixSum[j-1] = k
    • 移项可得,满足 prefixSum[i] - k = prefixSum[j-1] 即可
  • 已有: kprefixSum[i]------> 求是否存在 prefixSum[j-1],存在即可加上该值

2- 实现

⭐560. 和为 K 的子数组------题解思路

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        int res = 0;
        int prefixSum=0;

        for(int num:nums){
            prefixSum += num;
            if(map.containsKey(prefixSum-k)){
                res += map.get(prefixSum-k);
            }
            map.put(prefixSum,map.getOrDefault(prefixSum,0)+1);
        }

        return res;
    }
}

3- ACM 实现

java 复制代码
public class subArrayLength {


    public static int subLen(int[] nums,int k){
        //1.数据结构
        HashMap<Integer,Integer> hm = new HashMap<>();
        int res = 0;
        int prefixSum = 0;
        hm.put(0,1);
        for(int num:nums){
            prefixSum+=num;
            if(hm.containsKey(prefixSum-k)){
                res+=hm.get(prefixSum-k);
            }
            hm.put(prefixSum,hm.getOrDefault(prefixSum,0)+1);
        }
        return res;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入数组长度");
        int n = sc.nextInt();
        int[] nums = new int[n];
        for(int i = 0 ; i < n ;i++){
            nums[i] = sc.nextInt();
        }
        System.out.println("输入k");
        int k = sc.nextInt();
        System.out.println("结果是"+subLen(nums,k));
    }
}

相关推荐
sunxunyong11 分钟前
doris运维命令
java·运维·数据库
菜鸟起航ing13 分钟前
Spring AI 全方位指南:从基础入门到高级实战
java·人工智能·spring
古城小栈29 分钟前
Docker 多阶段构建:Go_Java 镜像瘦身运动
java·docker·golang
hetao173383732 分钟前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
MapGIS技术支持40 分钟前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
Coder_Boy_44 分钟前
业务导向型技术日志首日记录(业务中使用的技术栈)
java·驱动开发·微服务
鲨莎分不晴1 小时前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
盖世英雄酱581362 小时前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端
济南壹软网络科技有限公司2 小时前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app
廋到被风吹走2 小时前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式