字首和 路徑總和III 和為k的子陣列

2022-07-25 20:24:15 字數 1946 閱讀 9544

437. 路徑總和 iii

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

返回 3。和等於 8 的路徑有:

1. 5 -> 3

2. 5 -> 2 -> 1

3. -3 -> 11

常規思路:雙遞迴,先序遍歷的同時計算每個節點的路徑和數量。

/**

* definition for a binary tree node.

* public class treenode

* treenode(int val)

* treenode(int val, treenode left, treenode right)

* }*/class solution

int result = countpath(root,sum);

int a = pathsum(root.left,sum);

int b = pathsum(root.right,sum);

return result+a+b;

}public int countpath(treenode root,int sum)

sum = sum - root.val;

int result = sum == 0 ? 1:0;

return result + countpath(root.left,sum) + countpath(root.right,sum);}}

方法二:字首和?應該算記憶化遞迴

核心思路是,對於每乙個節點值,其前往根節點的路徑是唯一的。

借助p和陣列array可以將當前節點通往根節點所在路徑上的各個節點的值都儲存下來。

class solution 

//array陣列儲存某一次遞迴時所遍歷結點的值,p表示當前節點的位置

public int helper(treenode root, int sum, int array, int p)

array[p] = root.val;

int temp = 0;

int n = 0;

//計算當前節點到之前所有結點的路徑和,看看有沒有等於sum的

for(int i=p; i>=0; i--)

}//計算左右孩子到之前所有結點的路徑和。有的話一起算上

int left = helper(root.left, sum, array, p+1);

int right = helper(root.right, sum, array, p+1);

return n+left+right;}}

560. 和為k的子陣列

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。

示例 1 :

輸入:nums = [1,1,1], k = 2

輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。

說明 :

陣列的長度為 [1, 20,000]。

陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。

和為K的子陣列 字首和 雜湊表

給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。public int subarraysum int nums,int k mp.put pre,mp.getordefault ...

和為k的子陣列

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數 k 的範圍是 1e7,1e7 o n ...

和為k的子陣列

給你乙個整數陣列nums和乙個整數k,請你統計並返回該陣列中和為k的連續子陣列的個數 示例 1 輸入 nums 1,1,1 k 2 輸出 2示例 2 輸入 nums 1,2,3 k 3 輸出 2 一般看到陣列中的連續子陣列求和,我們會想到使用字首和 解法 字首和 public static int ...