力扣题560和为k的子数组
发布日期:2022-03-04 11:48:20
浏览次数:6
分类:技术文章
本文共 1238 字,大约阅读时间需要 4 分钟。
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2 示例 2:输入:nums = [1,2,3], k = 3
输出:2·自己一开始的想法是用一个滑动窗口,保存滑动窗口的起始下标和终点下标。但是发现这种做法是不对的,因为一开始的起始下标可能后面又会用到,不能直接抛弃,即右指针向后移1位不能保证区间会增大,左指针j向后移1位也不能保证区间和会减小。因此每一次都考虑以i为结尾的子数组中存在多少和为k的连续子数组。
1.暴力法,双重循环,判断每个起点终点之间的和是否可能为k值。考虑以i为结尾和为k的子数组个数。
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; }}
2.前缀和。
class Solution { public int subarraySum(int[] nums, int k) { int count = 0; int pre = 0; Mapmap = new HashMap<>();//存储前缀和 map.put(0,1);//初始化,一开始前缀和为0出现的次数是1 for (int i = 0;i < nums.length;i++) { pre += nums[i];//更新前缀和 if (map.containsKey(pre - k)) {//在当前以i为结尾的子数组中,是否存在前缀和为pre-k count += map.get(pre - k);//如果存在,那么就说明以i为结尾存在子数组的和为k } map.put(pre,map.getOrDefault(pre,0) + 1);//把当前前缀和插入map } return count; }}
题源:
转载地址:https://blog.csdn.net/xxyneymar/article/details/122296634 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月07日 23时17分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【算法学习】高级数据结构2 种类并查集
2021-07-01
洛谷 P1525 关押罪犯【种类并查集】
2021-07-01
洛谷 P2024 [NOI2001]食物链【种类并查集】
2021-07-01
POJ 1703 Find them, Catch them【种类并查集】
2021-07-01
POJ 2492 A Bug‘s Life【种类并查集】
2021-07-01
POJ 2236 Wireless Network【并查集】
2021-07-01
LeetCode C++ 214. Shortest Palindrome【字符串】困难
2021-07-01
洛谷 P2580 于是他错误的点名开始了【字典树/Map】
2021-07-01
HDU 3336 Count the string【KMP的next数组性质】
2021-07-01
洛谷 P1196 [NOI2002]银河英雄传说【带权并查集】
2021-07-01
HDU 4825 Xor Sum【01字典树/贪心】(两数最大/最小异或和)
2019-04-28
洛谷 P4551 最长异或路径【01字典树/贪心】
2019-04-28
LeetCode 921. 使括号有效的最少添加(栈)
2019-04-28
LeetCode 1018. 可被 5 整除的二进制前缀
2019-04-28
LeetCode 961. 重复 N 次的元素
2019-04-28
LeetCode 925. 长按键入(双指针)
2019-04-28
LeetCode 1309. 解码字母到整数映射
2019-04-28
LeetCode 873. 最长的斐波那契子序列的长度(动态规划)
2019-04-28