生活随笔
收集整理的這篇文章主要介紹了
算法 - 前缀和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
記錄在做hot100時遇到的前綴和的題目。 目前見過的題目,都是前綴和結合其它的方法一起使用:用于求取一段連續路徑的和(最大值/最小值/目標出現次數)。 需要注意的是,前綴和的判定方法是node2.val-node1.val == target ,不要搞錯順序。
文章目錄
1.路徑之和III
在數據結構 - 二叉樹記錄過,此處單獨拿出來。
給定一個二叉樹的根節點 root ,和一個整數 targetSum ,求該二叉樹里節點值之和等于 targetSum 的 路徑 的數目。 路徑 不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
符合求取連續路徑的和的特點。 使用DFS+前綴和的思路。DFS的一個明顯好處是,每條正在搜索的路徑一定符合題目中對路徑的要求。將當前路徑節點的前綴和記錄到path(此處為memo)備用。
class Solution ( object ) : res
= 0 def pathSum ( self
, root
, targetSum
) : """:type root: TreeNode:type targetSum: int:rtype: int""" self
. res
= 0 path
= [ 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 True dfs
( root
, targetSum
) return self
. res
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 這樣也是可以的,dfs路徑選擇和退出的位置要對應
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class Solution ( object ) : res
= 0 def pathSum ( self
, root
, targetSum
) : """:type root: TreeNode:type targetSum: int:rtype: int""" self
. res
= 0 path
= [ 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
+= 1 dfs
( 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 ( ) record
[ 0 ] = 1 summary
= 0 res
= 0 for num
in nums
: summary
+= num
if record
. __contains__
( summary
- k
) : res
+= record
[ summary
- k
] if record
. __contains__
( summary
) : record
[ summary
] += 1 else : record
[ summary
] = 1 return res
這里如果需要獲得具體的序列,也可以使用滑動窗口解決
class Solution : def FindContinuousSequence ( self
, tsum
) : if tsum
<= 1 : return [ ] start
, end
= 0 , 1 summary
= 0 res
= [ ] 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
+= 1 elif summary
< tsum
: summary
+= end end
+= 1 else : summary
-= start start
+= 1 return res
總結
以上是生活随笔 為你收集整理的算法 - 前缀和 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。