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

相关推荐
zzb15801 天前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
wuqingshun3141591 天前
如何停止一个正在退出的线程
java·开发语言·jvm
卷福同学1 天前
QClaw内测体验,能用微信指挥AI干活了
人工智能·算法·ai编程
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章34-投影向量
图像处理·人工智能·opencv·算法·计算机视觉
xiaoye-duck1 天前
《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂
数据结构·c++·算法·递归
Eward-an1 天前
【算法竞赛/大厂面试】盛最多水容器的最大面积解析
python·算法·leetcode·面试·职场和发展
山栀shanzhi1 天前
归并排序(Merge Sort)原理与实现
数据结构·c++·算法·排序算法
阿豪学编程1 天前
LeetCode438: 字符串中所有字母异位词
算法·leetcode
Trouvaille ~1 天前
【递归、搜索与回溯】专题(七):FloodFill 算法——勇往直前的洪水灌溉
c++·算法·leetcode·青少年编程·面试·蓝桥杯·递归搜索回溯
地平线开发者1 天前
征程 6P codec decoder sample
算法·自动驾驶