题目描述:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
- 数组的长度为 [1, 20,000]。
- 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]
Solution:
solution1:时间复杂度为O(N^2),简单解法,还有更简单的解法,时间复杂度为O(N^3),但是用python超出时间限制
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums_len, flag = len(nums), 0
#主循环,遍历整个数组
for i in range(nums_len):
sum = 0
#上一个存在情况下再开始遍历,相当于是每次都从i开始遍历,找到和为k的子区间的个数
for j in range(i, nums_len):
sum += nums[j]
if sum == k:
flag += 1
return flag
solution2:时间复杂度为O(N)
核心思想:
将数组中的元素依次加和,比如,给定一个数组为[2,7,11,15],那么加和后的元素存放在一个字典里,字典初始化为{0:1},因为是为了防止从原数组首元素加和就为K的情况,即sum - k = 0的情况,所以加和后的字典为{0,9,20,35},从字典中搜索,如果sum-k存在于字典中,则符合情况的次数加字典中sum-k的个数。加和时如果sum在原先字典中存在,则该sum数加一,若是第一次发现,则该sum数赋值为1.
class Solution:
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
dict,sum,res = {0:1},0,0
for i in nums:
sum += i
if sum - k in dict:
res += dict[sum - k]
if sum in dict:
dict[sum] += 1
else:
dict[sum] = 1
return res