Subarray Sum Equals K

2024-09-04 14:32
文章标签 subarray sum equals

本文主要是介绍Subarray Sum Equals K,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

思路:用prefixsum prefixsum[j+1] - prefixsum[i] = k,  类似2sum,用hashmap优化,注意先判断是否含有,再加入,否则会有重复计算;if(sum == k) count++;

class Solution {public int subarraySum(int[] nums, int k) {if(nums == null || nums.length == 0) {return 0;}int n = nums.length;int[] prefixSum = new int[n + 1];for(int i = 1; i <= n; i++) {prefixSum[i] = prefixSum[i - 1] + nums[i - 1];}HashMap<Integer, Integer> hashmap = new HashMap<>();//       sum      frequency;int count = 0;for(int i = 1; i <= n; i++) {if(prefixSum[i] == k) {count++;}// 存prefixsum -k, 也就是之前的比较小的数,这样在后面一旦碰见,那么就表示相吻合,a - b = k;if(hashmap.containsKey(prefixSum[i] - k)) {count += hashmap.get(prefixSum[i] - k);}hashmap.put(prefixSum[i], hashmap.getOrDefault(prefixSum[i], 0) + 1);}return count;}
}

减少内存,可以用cursum来代替prefixsum; 

class Solution {public int subarraySum(int[] nums, int k) {if(nums == null || nums.length == 0) {return 0;}int n = nums.length;int cursum = 0;//       sum      frequency;HashMap<Integer, Integer> hashmap = new HashMap<>();int count = 0;for(int i = 0; i < nums.length; i++) {cursum += nums[i];if(cursum == k) {count++;}// 存prefixsum - k, 也就是之前的比较小的数,这样在后面一旦碰见,那么就表示相吻合,a - b = k;// count已经加过1了,那么这里只需要加入之前的频率。if(hashmap.containsKey(cursum - k)) {count += hashmap.get(cursum - k);}// hashmap里面的频率要+1;hashmap.put(cursum, hashmap.getOrDefault(cursum, 0) + 1);}return count;}
}

这篇关于Subarray Sum Equals K的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136242

相关文章

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

[LeetCode] 303. Range Sum Query - Immutable

题:https://leetcode.com/problems/range-sum-query-immutable/description/ 题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums

[LeetCode] 64. Minimum Path Sum

题:https://leetcode.com/problems/minimum-path-sum/description/ 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers

[LeetCode] 404. Sum of Left Leaves

题:https://leetcode.com/problems/sum-of-left-leaves/description/ 题目 Find the sum of all left leaves in a given binary tree. Example: 3/ \9 20/ \15 7There are two left leaves in the binary t

重写equals和hashCode的原则规范

当符合以下条件时不需要重写equals方法:     1.     一个类的每一个实例本质上都是唯一的。     2.     不关心一个类是否提供了“逻辑相等”的测试功能     3.     超类已经改写了equals方法,并且从超类继承过来的行为对于子类也是合适的。     4.     一个类时私有的或者是package私有的,并且可以确定它的equals方法永远不会被调用。(这

数论 --- 费马小定理 + 快速幂 HDU 4704 Sum

Sum  Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=4704   Mean:  给定一个大整数N,求1到N中每个数的因式分解个数的总和。   analyse: N可达10^100000,只能用数学方法来做。 首先想到的是找规律。通过枚举小数据来找规律,发现其实answer=pow(2,n-1);

LeetCode - 40. Combination Sum II

40. Combination Sum II  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个待选集合s和一个数n,选出所有相加之和为n的组合.(每个元素只能选一次) analyse: 递归求解. 在递归进入