我的解法:
想的是通过简单动态规划的方式来做,结果超时了
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
sum_record=[0]*len(nums)
ans=0
for seq_len in range(0,len(nums)):
for x in range(0,len(nums)-seq_len):
sum_record[x]=sum_record[x]+nums[x+seq_len]
if sum_record[x]==k:
ans+=1
return ans
标准解法:
用字典存储能组成这个和的可能性
最初的{0:1}代表不和任何数字相加,元素的初值就是一种可能
在逐步求和的同时,判断差值是否已经出现在字典里,如果出现过了,那么答案就加上对应的组合可能,之后判断和是否出现在字典里过,如果出现过那么对应的可能组合+1
没有出现过就设1,
比如在某一步和为20,要求k是12,超值为8,发现8在之前出现过,因为计算和的时候是从头一直连续加,所以去除之前的那部分从头开始的部分,剩下的部分依然是连续的,符合题目要求
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
sumDict = {0:1}
length = len(nums)
sumUnitlI = 0
ans = 0
for i in range(length):
sumUnitlI = sumUnitlI + nums[i]
if sumUnitlI - k in sumDict:
ans = sumDict[sumUnitlI-k] + ans
if sumUnitlI in sumDict:
times = sumDict[sumUnitlI]
sumDict[sumUnitlI] = times+1
else:
sumDict[sumUnitlI] = 1
return ans