力扣560(java&python)-和为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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
前缀和+哈希表:
前缀和:表示nums的第0项到当前项的和。
- 定义一个prefixSum数组,prefixSum[x]:第0项到第x项的和。prefixSum[x] = nums[0] + nums[1]+...+nums[x];
- nums的某项 = 两个相邻前缀和之差:nums[x] = prefixSum[x] - prefixSum[x - 1]
- nums的第 i 到 j 项的和:nums[i]+...+nums[j] = prefixSum[j] - prefixSum[i-1]
- 当 i 为0时,此时i-1 = -1,故意让prefixSum[-1]为0,使得通式在i=0时也成立:nums[0] + ...+ nums[j] = prefixSum[j]
题目的意思就是求从第i 到 j项的子数组和等于k <==>有几种ij组合,满足prefixSum[j] -prefixSum[i -1] == k。
- 不关心具体那两项的前缀和之差为k,只关心前缀和之差为k出现的次数;
- 在遍历nums之前,故意让-1所对应的前缀和为0,这样通式在边界情况也成立,即在遍历之前,首先将前缀和为0 出现1次了 ==><0 : 1>放入map中;
- 遍历nums,求每一项的前缀和,统计对应的出现次数,以键值对存入map;
- 边存边查看map,如果map中存在key为【当前前缀和 - k】,说明之前出现的前缀和满足【当前前缀和 - key == k】,它出现的次数不断累加给count。
java代码:
1 class Solution {
2 public int subarraySum(int[] nums, int k) {
3 Map<Integer, Integer> map = new HashMap<>();
4 //先把边界<0, 1>:前缀和为0的次数加入到map中
5 map.put(0,1);
6 int presum = 0;
7 int count = 0;
8 //计算前缀和
9 for(int num : nums){
10 presum += num;
11 //如果存在历史前缀和,则将次数统计到count中
12 if(map.containsKey(presum - k)){
13 count += map.get(presum - k);
14 }
15 map.put(presum, map.getOrDefault(presum, 0) + 1);
16 }
17 return count;
18 }
19 }
python3代码:
1 class Solution:
2 def subarraySum(self, nums: List[int], k: int) -> int:
3 #当key不存在,默认为0
4 map = collections.defaultdict(int)
5 count = 0
6 n = len(nums)
7 presum = 0
8 map[0] = 1
9 for i in range(n):
10 presum += nums[i]
11
12 count += map[presum - k]
13 map[presum] += 1
14 return count
力扣560(java&python)-和为k的子数组(中等)的更多相关文章
- 力扣 - 560. 和为K的子数组
目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...
- Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)
560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] ...
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...
- 累加和为 K 的子数组问题
累加和为 K 的子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的子数组问题 CSDN:累加和为 K 的子数组问题 题目说明 数组全为正数,且每个数各不相同,求累加和为K的子数组组合有哪 ...
- 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...
- 【力扣】有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素.请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ 1, 5, ...
- [LeetCode]560. 和为K的子数组(前缀和)
题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为 ...
- LeetCode 560. Subarray Sum Equals K (子数组之和等于K)
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- [Swift]LeetCode560. 和为K的子数组 | Subarray Sum Equals K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
随机推荐
- pod常见的非故障及故障状态解析
在Kubernetes中,Pod的状态可以反映其当前的生命周期状态.是否正常运行或遇到了某些状况.以下是一些Pod常见的非故障状态: Running:这是Pod最常见的非故障状态,表示Pod已经成功调 ...
- python数组基本用法实例解析
一 数组的内容的查找 array的查找是依靠index,超出内容的会报错误 import array int_array = array.array('i', [0, 1, 2, 3, 1, 2]) ...
- 使用gitee
git全局设置 git config --global user.name "张xx" git config --global user.email "xxx@qq.co ...
- 没想到三天10KStar的营销利器MediaCrawler开源作者已经删库了
前言 一站式社交平台数据抓取利器,带你玩转小红书.抖音.快手.B站和微博数据分析 不经意间,来查看MediaCrawler仓库源码,发现作者已经删库了.看来是领奖了.才几天不到的时间Star数量已经直 ...
- 记录--你不知道的forEach函数
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 老实说我不喜欢用forEach,因为它导致的一些bug总是这么不经意,盘点我不喜欢的原因 原因一:不支持处理异步函数 先看一个例子: as ...
- 记录--Cesium+Vue实战教程——地图导航
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 项目效果 我们今天要实现的是一个路径规划的功能,有两个输入框.输入起点终点,然后查询,得到规划的路径,效果如下: 我们会用到以下库: Ax ...
- drools执行指定的规则
目录 1.背景 2.方案 2.1 通过AgendaFilter来实现 2.2 通过entry-point来实现 3.实现 3.1 需求 3.2 drl 文件编写 3.3 部分java代码 3.4 运行 ...
- Oracle 章节编号排序
测试代码 CREATE TABLE TEST (CH_CODE VARCHAR2(10)); INSERT INTO TEST (CH_CODE) VALUES ('1.1'); INSERT INT ...
- 数字电路之MOS设计
数字电路之MOS设计 1.MOS的基本性质 MOS,即场效应管,四端器件,S.D.G.B四个端口可以实现开和关的逻辑状态,进而实现基本的逻辑门.NMOS和PMOS具有明显的对偶特性:NMOS高电平打开 ...
- 才储性格测试(INTJ 专家型——追求能力与独立)
INTJ 专家型--追求能力与独立 一.你的荣格理论图形 二.基本描述 才储分析:您的性格类型倾向为" INTJ "(内向 直觉 思维 判断 倾向度: I60 N56 T74 J5 ...