560. 和为K的子数组

知识点:数组;前缀和

题目描述

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

解法一:暴力法

直接以每个元素为首开始;

class Solution {
public int subarraySum(int[] nums, int k) {
int sum = 0;
int count = 0;
for(int i = 0; i < nums.length; i++){ //依次以元素开始;
for(int j = i; j < nums.length; i++){
sum += nums[j];
if(sum == k) count++;
}
sum = 0; //一次结束后归零;
}
return count;
}
}

时间复杂度:O(N^N);

解法二:前缀和

前缀和是很常见的一种解题思路,其含义就是高中学过的数列的前n项和;



所以如果我们要求哪个子序列和为k的话,就可以转化为求前缀和数组中哪两个的值相减等于k。这熟悉吗?对啊,这不就是两数之和那个题吗?还记得怎么做的吗?就是用哈希表存,key和value分别就是数值和其索引下标,为什么存索引下标,因为那个题让我们求的就是索引下标。那类比一下,这个题呢,这个题是让我们干嘛,是求有几项和,那我们的value就是对应的前n项和为某个值的有几个,这样减出来的子序列就有几个;

// 前缀和没有优化;
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0;
int[] premsum = new int[nums.length+1]; //比原数组长一位,第一位置为0;这样才能把nums[1]包括;
for(int i = 0; i < nums.length; i++){ //构建前缀和数组;
premsum[i+1] = premsum[i] + nums[i];
}
for(int i = 0; i < premsum.length-1; i++){
for(int j = i+1; j < premsum.length; j++){
if(premsum[j] - premsum[i] == k) count++;
}
}
return count;
}
}

时间复杂度:依然是O(N^N);

// 前缀和+哈希表;
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int premsum = 0;
int count = 0;
for(int i = 0; i < nums.length; i++){
premsum += nums[i]; //前缀和;
if(map.containsKey(premsum-k)) count += map.get(premsum-k);
map.put(premsum, map.getOrDefault(premsum, 0)+1); //前缀和为不同值的有几次;
}
return count;
}
}

时间复杂度:O(N);

体会

前缀和是一种很常用的思想,要对触发它的条件敏感 连续子数组+和,也就是用在哪一种题型里;

其次,哈希表也要敏感,比如在一个题目中有两数之和,那就要去用哈希表,可以利用其containsKey函数检索,从而少一次for循环;而哈希表中value的值就由我们要获得什么决定,比如此题是获得子数组的个数,那value就是每个和的次数;比如我们要获得子数组的大小或者下标,那value就是元素的索引,对症下药。

相关题目

1. 两数之和

930. 和相同的二元子数组

724. 寻找数组的中心下标

1248. 统计「优美子数组」

974. 和可被 K 整除的子数组

523. 连续的子数组和

【LeetCode】560. 和为K的子数组的更多相关文章

  1. LeetCode——560. 和为K的子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...

  2. Leetcode 560.和为k的子数组

    和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1 ...

  3. LeetCode 560. 和为K的子数组(Subarray Sum Equals K)

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

  4. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  5. 560. 和为K的子数组

    Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...

  6. 力扣 - 560. 和为K的子数组

    目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...

  7. 【Leetcode】560. 和为K的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)

    public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...

  8. 力扣题解-560. 和为K的子数组

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

  9. 【LeetCode】1248. 统计「优美子数组」

    1248. 统计「优美子数组」 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. ...

随机推荐

  1. NVIDIA CUDA-X AI

    NVIDIA CUDA-X AI 面向数据科学和 AI 的 NVIDIA GPU 加速库 数据科学是推动 AI 发展的关键力量之一,而 AI 能够改变各行各业. 但是,驾驭 AI 的力量是一个复杂挑战 ...

  2. Java真的是白天鹅

    前言 我最近越来越真切的感受到,Java真的是白天鹅. 这真的是一种羡慕嫉妒恨的感受. 今天和一个Java技术Leader聊天,我告诉他敏捷开发是以人为本,他居然跟我说敏捷开发在行业内有规范,规范是死 ...

  3. SpringBoot+SpringDataJpa快速上手(基本CRUD)

    以及表结构和数据 依赖 <!-- 如果有SpringBoot启动器,就不加--> <parent> <groupId>org.springframework.boo ...

  4. NEXTCLOUD 常见错误

    HTTP请求头"Strict-Transport-Security"没有配置为至少"15552000"秒出于增强安全性考虑推荐按照安全提示中的说明启用HSTS ...

  5. 【模拟7.22】visit(卢卡斯定理&&中国剩余定理)

    如此显然的组合数我把它当DP做,我真是.... 因为起点终点已经确定,我们发现如果我们确定了一个方向的步数其他方向也就确定了 组合数做法1: 设向右走了a步,然后向左走了b=a-n步,设向上为c,向下 ...

  6. mybatis-generator的使用心得

    之前开发了一个亚健康测评系统,使用的是SSM框架,里面第一次使用到了mybatis-generator逆向代码生成工具,很方便,省去了基本的增删改查的mapper文件及sql的编写,还能避免错误,这里 ...

  7. 机械革命z2安装ubuntu20

    为了性能买了个游戏本机械革命z2,但还是想用上linux,身为程序员习惯了linux的开发环境有点离不开.但是之前尝试安装deepin或者linux都失败了,一是N卡条件下安装过程和安装之后的显示有问 ...

  8. noip模拟10[入阵曲·将军令·星空](luogu)

    对于这次考试来说,总体考得还是不错的 就是有一个小问题,特判一定要判对,要不然和不判一样,甚至错了还会挂掉30分 还有一个就是时间分配问题,总是在前几个题上浪费太多时间,导致最后一个题完全没有时间思考 ...

  9. 一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今生

    前言 在<spring中FactoryBean是什么bean>一文中,带着小伙伴学习了spring中的FactoryBean,了解了到了FactoryBean其实是一种生产Bean的bea ...

  10. string转char*/char[]

    转char* 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); 1.data() data()仅返回字符串内容,而不含有结束符'\0' std: ...