力扣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 ...
随机推荐
- Springboot K8s Job 一次性任务 如何禁用端口监听
问题:SpringBoot一次性任务执行时,也会默认监听服务端口,当使用k8s job运行时,可能多个pod执行存在端口冲突 解决办法:命令行禁用SpringBoot一次性任务启动时端口占用 java ...
- openssl 版本兼容问题 备忘录
第三方依赖openssl,但openssl却有版本不同符号不兼容的问题,由于条件限制不得不使用固定版本的openssl,又或者同时有两个第三方依赖不同版本的openssl,只能靠手动,为了备忘. 1. ...
- Dll堆栈问题(Dll的静态变量与全局变量、vs的MT与MD)
问题引入:dll有一个导出函数,函数参数是string&,string在函数内部被=赋值.在exe动态加载此dll,调用此导出函数后,会崩溃. 原因:如果任何STL类的实现中使用了静态变量(我 ...
- dbvisivuser连oracle数据库报错没有权限
原因:数据库从11g升级为19c了 解决:ojdbc.jar也要换成最新的,导致报错的旧jar包2M大小,换成新jar包3M大小.替换jar包要将 dbvisivuser的tool driverMan ...
- [开源初探]screenshot-to-code:将截图转化为代码
介绍说明 将截图转化为 HTML 代码的工具.该项目可以将屏幕截图转化为 HTML/JS/Tailwind CSS 代码,它使用 GPT-4 Vision 生成代码.DALL-E 3 生成相似的图片. ...
- python pyzbar 批量识别二维码
1.安装pyzbar pip install pyzbar 2.代码 import os import cv2 as cv from pyzbar import pyzbar # 目录路径 path ...
- KingbaseES索引坏块
错误信息产生: 下面的报错一般为有坏块的产生. test=# select max(create_time) from public.tbl_table where create_time>=' ...
- archlinux修改btrfs文件系统大小出现ERROR: unable to retrieve fs info
提权sudo就可以了 例: sudo btrfs filesystem resize max /
- 什么是OOP(Object Oriented Programming)面向对象编程
1.认识面向对象首先要认识面向过程 面向过程编程,举个例子 比如有一天你要吃回锅肉,你会先去准备食材,然后一步一步把这道菜做出来,这就是面向过程. 还有一种方式你依然可以得到这道菜,你可以去饭店直接点 ...
- 14 JavaScript神奇的windows
14 神奇的windows window对象是一个很神奇的东西. 你可以把这东西理解成javascript的全局. 如果我们默认不用任何东西访问一个标识符. 那么默认认为是在用window对象. 例如 ...