日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法 - 前缀和

發布時間:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法 - 前缀和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄在做hot100時遇到的前綴和的題目。
目前見過的題目,都是前綴和結合其它的方法一起使用:用于求取一段連續路徑的和(最大值/最小值/目標出現次數)。
需要注意的是,前綴和的判定方法是node2.val-node1.val == target,不要搞錯順序。

文章目錄

  • 1.路徑之和III
  • 2.和為 K 的子數組

1.路徑之和III

在數據結構 - 二叉樹記錄過,此處單獨拿出來。

給定一個二叉樹的根節點 root ,和一個整數 targetSum ,求該二叉樹里節點值之和等于 targetSum 的 路徑 的數目。
路徑 不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

符合求取連續路徑的和的特點。
使用DFS+前綴和的思路。DFS的一個明顯好處是,每條正在搜索的路徑一定符合題目中對路徑的要求。將當前路徑節點的前綴和記錄到path(此處為memo)備用。

class Solution(object):res = 0def pathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: int"""self.res = 0path = [0] # 記錄當前路徑的前綴和def dfs(node, targetSum):# 出口if node is None:return False# 一般情況path.append(node.val + path[-1])for i in range(len(path) - 1):if path[-1] - path[i] == targetSum:self.res += 1# 執行選擇并撤銷if dfs(node.left, targetSum):path.pop()if dfs(node.right, targetSum):path.pop()return Truedfs(root, targetSum)return self.res ---------------------------------這樣也是可以的,dfs路徑選擇和退出的位置要對應-----------------------------------class Solution(object):res = 0def pathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: int"""self.res = 0path = [0] # 記錄當前路徑的前綴和def dfs(node, targetSum):# 出口if node is None:return# 一般情況path.append(node.val + path[-1]) # 在這選擇for i in range(len(path) - 1):if path[-1] - path[i] == targetSum:self.res += 1dfs(node.left, targetSum)dfs(node.right, targetSum) path.pop() # 在這退出dfs(root, targetSum)return self.res

2.和為 K 的子數組

給你一個整數數組 nums 和一個整數 k ,請你統計并返回該數組中和為 k 的連續子數組的個數

符合求取連續路徑的和

class Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""# 前綴和+哈希表# 對于數組/樹 的連續路徑上求和,可以用前綴和相減record = dict() # 前綴和key 出現次數為valrecord[0] = 1 # 為了能計算首個元素summary = 0res = 0for num in nums:summary += num# 查看之前是否有結果if record.__contains__(summary - k): # !!!!!!!!!!!!!!!!!res += record[summary - k]# 更新recordif record.__contains__(summary):record[summary] += 1else:record[summary] = 1return res
  • 這里如果需要獲得具體的序列,也可以使用滑動窗口解決
class Solution:def FindContinuousSequence(self, tsum):if tsum <= 1:return []start, end = 0, 1summary = 0res = [] while (start <= end and end <= (tsum // 2 + 2)):if summary == tsum:res.append([i for i in range(max(start, 1), end)])summary += end end += 1elif summary < tsum:summary += end end += 1else:summary -= start start += 1return res

總結

以上是生活随笔為你收集整理的算法 - 前缀和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。