解题关键词:前缀和
问题描述
给你一个数组序列,有正有负。在数组中找到所有这样的子序列:子序列和等于给定数字k。
我的解答
我们最先想到的肯定是暴力解,遍历每一个元素,然后从当前元素依次往后叠加得到想要的结果,O(n2)复杂度。
还有一个O(n)复杂度的方法:
先遍历一遍数组,计算出第0到第i的连续和,后面称为前缀和。
然后第i到第j的连续和怎么计算应该已经想到了:第j的前缀和减去第i的前缀和。
所以再遍历一遍数组,遍历到第j的时候,要找连续和为k的序列,所以就找找前面有没有前缀和为(j的前缀和-k)的前缀和,有一个就多一个序列。
在遍历的过程中,每遍历一个j,就把他的前缀和放入一个map里(前缀和,个数),为了后面遍历时直接读取。
class Solution {
public int subarraySum(int[] nums, int k) {
int len = nums.leng