当前位置: 首页 > article >正文

LeetCode—560. 和为 K 的子数组(中等)

题目描述:

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

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

示例1:

输入:nums = [1,1,1], k = 2
输出:2

示例2:

输入:nums = [1,2,3], k = 3
输出:2

题目解析:

思路一:暴力枚举

遍历数组中的每个元素start,用end由start的位置向前遍历,计算[end,start]子数组的和sum。

实现代码:
class Solution {
    public int subarraySum(int[] nums, int k) {
        //枚举
        int count = 0;
        for(int start = 0;start<nums.length;start++){
            int sum = 0;
            for(int end = start;end >= 0;end--){
                sum += nums[end];
                if(sum == k){
                    count++;
                }
            }
        }
        return count;
    }
}

 思路二:前缀和+哈希表

       枚举法时间复杂度是O(n^2),对于大数组来说效率较低。可以通过使用前缀和和哈希表的方法将时间复杂度降低到O(n)。以下是优化后的算法思路:

        通过计算前缀和,我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。那么对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。

        通过遍历数组,计算每个位置的前缀和,并使用一个哈希表来存储每个前缀和出现的次数。在遍历的过程中,我们检查是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。 这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。 

实现代码:
class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0,pre = 0;
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        for(int i = 0;i < nums.length;i++){
            pre += nums[i];
            if(map.containsKey(pre - k)){
                count += map.get(pre - k);
            }
            map.put(pre,map.getOrDefault(pre,0) +1);
        }
        return count;
    }
}


http://www.kler.cn/a/421553.html

相关文章:

  • 渗透测试之Web基础之Linux病毒编写——泷羽sec
  • qt QToolBox详解
  • 【排序用法】.NET开源 ORM 框架 SqlSugar 系列
  • pycharm链接neo4j数据库(简单)
  • 【iOS】多线程基础
  • SpringBoot集成Milvus|(实现向量的存储和查询)
  • Windows远程桌面连接到Linux
  • 计算机视觉硬件知识点整理六:工业相机选型
  • C++ Qt——从入门到入土 (二)
  • PyTorch 实现动态输入
  • 快速讲图片中的公式粘贴到word中
  • 大模型安全科技发展仍处在起步阶段
  • 【AI系统】昇腾异构计算架构 CANN
  • 分布式资源调度——yarn 概述(资源调度基本架构和高可用的实现)
  • qt QGradient详解
  • linux基础病毒编写
  • 动态规划-----路径问题
  • 【Go底层】select原理
  • 自由学习记录(28)
  • 8 Bellman Ford算法SPFA
  • 全面解析Astra+深度相机模块:组件、功能与应用
  • 初次chronyd安装使用
  • Day 32 动态规划part01
  • 探索 SpringBoot 于 MVC 模式下高校办公室行政事务管理系统的设计与实现
  • 常见排序算法总结 (三) - 归并排序与归并分治
  • 网络安全防范技术