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

相关推荐
L.EscaRC6 分钟前
Spring Boot 自定义组件深度解析
java·spring boot·后端
pengzhuofan13 分钟前
IntelliJ IDEA 常用快捷键
java·ide·intellij-idea
蒙奇D索大14 分钟前
【算法】递归的艺术:从本质思想到递归树,深入剖析算法的性能权衡
经验分享·笔记·算法·改行学it
ANGLAL15 分钟前
17.MyBatis动态SQL语法整理
java·sql·mybatis
王哈哈^_^24 分钟前
【数据集+完整源码】水稻病害数据集,yolov8水稻病害检测数据集 6715 张,目标检测水稻识别算法实战训推教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
SheepHappy29 分钟前
MyBatis-Plus 源码阅读(二)代码生成器原理深度剖析
java·源码阅读
雨白38 分钟前
重识 Java IO、NIO 与 OkIO
android·java
light_in_hand40 分钟前
内存区域划分——垃圾回收
java·jvm·算法
金銀銅鐵41 分钟前
[Java] JDK 9 新变化之 Convenience Factory Methods for Collections
java·后端
用户7406696136251 小时前
入门并理解Java模块化系统(JPMS)
java