【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));
    }
}

相关推荐
超龄超能程序猿7 分钟前
Spring AI Alibaba 与 Ollama对话历史的持久化
java·人工智能·spring
hrrrrb10 分钟前
【Spring Security】认证(二)
java·后端·spring
33255_40857_2805915 分钟前
告别密码爆破!手把手教你用注解和拦截器实现登录限流
java
舒克日记23 分钟前
基于springboot针对老年人的景区订票系统
java·spring boot·后端
【杨(_> <_)】27 分钟前
SAR信号处理重要工具-傅里叶变换(二)
算法·信号处理·傅里叶分析·菲涅尔函数
怎么没有名字注册了啊32 分钟前
爬动的蠕虫
算法
取酒鱼食--【余九】32 分钟前
机器人学基础(一)【坐标系和位姿变换】
笔记·算法·机器人·开源·机器人运动学·机器人学基础
西西学代码33 分钟前
Flutter---showCupertinoDialog
java·前端·flutter
多多*37 分钟前
上传文件相关业务,采用策略模式+模版方法模式进行动态解耦
java·开发语言