力扣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中断预算 PodDisruptionBudget(PDB)
PodDisruptionBudget(PDB)是Kubernetes中的一个资源对象,用于确保在进行维护.升级或其他操作时,系统中的Pod不会被意外中断或终止.PDB提供了一种机制,通过限制在给定时 ...
- 【数据结构】C语言实现动态扩容数组
// resizable array /* Think about a set of functions that provide a mechanism of resizable array of ...
- 微型MPU6050模块及串口/BLE透传的实物展示
前言 随着时间的积累,项目的沉淀.把很多做过的产品标准化掉,形成可以立即拿出来使用的产品.是非常重要的一个环节.最近,把基于MPU6050的模块微型化并使用串口透传这个产品梳理了一下.形成了标准化 ...
- day01-项目介绍+SSM环境搭建
项目介绍+SSM环境搭建 1.项目功能/界面 SSM整合项目界面:使用Vue完成 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM 前端框架-Vue3 后端框架-SSM(SpringMVC+S ...
- 记录--vue3 + mark.js | 实现文字标注功能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 页面效果 具体实现 新增 1.监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位 ...
- 记录--vue3优雅的使用element-plus的dialog
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 如何优雅的基于 element-plus,封装一个梦中情 dialog 优点 摆脱繁琐的 visible 的命名,以及反复的重复 dom. ...
- 性能测试系列:高可用测试linux常用命令
一 linux常用 df –h 看磁盘 du –h –max-depth=1 查看当前目录下,各个文件夹大小 ls –lht 查看当前目录下,各个文件大小 top –H –p pid 看进程下线程的资 ...
- nginx location块
location块在server块中使用,它的作用是根据客户端请求URL去定位不同的应用. 匹配格式 作用 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ...
- C# 获取QQ会话聊天信息
利用UIAutomation获取QQ会话聊天信息 AutomationElement window = AutomationElement.FromHandle(get.WindowHwnd); Au ...
- 卷积神经网络学习笔记——ZFNet(Tensorflow实现)
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这个网络应该是CNN的鼻 ...