JAVA算法练习题day40
48.路径总和③
“如果二叉树是一条链,那么这题就和560.和为K的子数组一样了”
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def pathSum(self, root, targetSum):""":type root: Optional[TreeNode]:type targetSum: int:rtype: int"""self.ans = 0cnt = {0:1}def dfs(root,s):if root is None:returns += root.valself.ans += cnt.get(s-targetSum,0)cnt[s] = cnt.get(s,0) + 1dfs(root.left,s)dfs(root.right,s)cnt[s]-=1returndfs(root,0)return self.ans
多做一题相关的:560.和为K的子数组
这题做过,发现还是不会。没想起前缀和+哈希表(讲到哈希,不一定是set,还有map)的做法。有想不起做法做不出来的挫败感,但是都是正常的,以后工作可能会面对更多的挫败感,在学算法题时候多锻炼自己的专注度意志力以及对应挫败感的能力吧。
前缀和+哈希表(这次认真手算了题解里的例子,更加熟悉算法运作的流程了)
先枚举s[j],从1开始。在字典里找不到值为s[j]-k的数,就把s[j]放入字典(下次++的时候,这次放入的s[j]就成为了i<j里面的i,符合题意)的key,其value是count s[j]出现的次数(因为随着遍历,可能会有相同的前缀和放进来)。若字典里找到了值为s[j]-k的数,将其value(出现次数)累加到ans。Return ans
class Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""s = (len(nums)+1) * [0]for i in range(len(nums)):s[i+1] = s[i] + nums[i]ans = 0cnt = defaultdict(int)for sj in s:#如果 key 不存在,返回 default(这里是 0)ans += cnt.get(sj-k,0)cnt[sj] += 1return ans