1 两数之和
思路一:暴力法
思路二:哈希表法
class Solution(object):
def twoSum(self, nums, target):
d ={}
res = []
for i in range(len(nums)):
sum = target - nums[i]
if sum in d:
res = [d[sum], i]
break
d[nums[i]] = i
return res
560 和为K的子数组
思路一:暴力法
以每个数字作为起点,搜索是否存在相加为目标值的解
class Solution(object):
def subarraySum(self, nums, k):
if not nums:
return 0
res = 0
for i in range(len(nums)):
sum = 0
for j in range(i, len(nums)):
sum += nums[j]
if sum == k:
res += 1
return res
时间复杂度O(n2),超时。
空间复杂度O(1)
思路二:哈希表
利用哈希表模拟动态规划,因为在思路一中,其实做了很多次的重复计算,那么可以用哈希表保存在累加过程中sum出现的次数(比如dict[3]得到5,表示和为3的从index=0开始的连续子序列有5个),当sum大于k时,超出的部分sum-k如果存在于哈希表中,则代表从当前下标i往前有连续的子数组的和为sum,就可以直接对结果相加
class Solution(object):
def subarraySum(self, nums, k):
sum, res, cul = 0, 0, {}
#dict的第一个key的value直接赋为1
cul[0] = 1
for i in range(len(nums)):
#开始累加
sum += nums[i]
#sum-k存在就累加
res += cul.get(sum - k,0)
#记得要把当前sum出现的次数也记入哈希表中
cul[sum] = cul.get(sum, 0) + 1
return res
时间复杂度O(n)
空间复杂度O(n)