Leecode热题100-560.和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k的子数组的个数。

子数组是数组中元素的连续非空序列。

示例 1:

复制代码
输入:nums = [1,1,1], k = 2
输出:2

示例 2:

复制代码
输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

读一遍应该就懂了,不懂留言或者私信,看到第一时间解答

java 复制代码
class Solution {
    /**这个题目竟然有负数,所以不符合滑动窗口的条件
    这个题我们需要用哈希表的解法,基本思路就是如果从0~i的累加值是x
    前面某个位置0~j的累加和中有多少个x-k,那以i结尾的子数组就有多少个*/
    public int subarraySum(int[] nums, int k) {
        /**边界判断,也可以没有 */
        if(nums.length == 1 && nums[0] != k) {
            return 0;
        }
        /**定义一个hashmap,用来保存0~j位置的某个累加和出现了多少次 */
        Map<Integer,Integer> countMap = new HashMap<>();
        /**这里一定要放个0的值,因为很可能0位置的值就是k */
        countMap.put(0,1);
        int preSum = 0;
        /**count用来统计结果数 */
        int count = 0;
        for(int i = 0; i < nums.length; i++) {
            /**把当前值加到preSum里 */
            preSum += nums[i];
            /**当前的累加和是preSum,如果前面出现了preSum-k多少次,就有多少个以i位置结尾的子数组的和为k
            如果没有preSum-k,则没有以i位置结尾的子数组满足这个条件
            这里我们举个例子,比如当前的累加和是100,然后我们的k是20,那我们只需要看一下前面有多少个80就行了
            这个80是啥呢,就是preSum - k */
            if(countMap.containsKey(preSum - k)) {
                count += countMap.get(preSum - k);
            }
            /**不管包含不包含,当前的值都要放进去,记住用原来的数量(或者0)+ 1*/
            countMap.put(preSum, countMap.getOrDefault(preSum, 0) + 1);
        }
        return count;
    }
}
相关推荐
Navigator_Z4 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
伯恩bourne5 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_5 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li5 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
省钱兄--zs5 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261686 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
旺仔仔仔6 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
helmsail6 小时前
05 管理活动与选品
java