LeetCode 目標和(深度優先搜尋 動態規劃)

2021-09-16 20:36:32 字數 1759 閱讀 6301

給定乙個非負整數陣列,a1, a2, …, an, 和乙個目標數,s。現在你有兩個符號 + 和 -。對於陣列中的任意乙個整數,你都可以從 + 或 -中選擇乙個符號新增在前面。

返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。

示例 1:

輸入: nums: [1, 1, 1, 1, 1], s: 3

輸出: 5

解釋:

-1+1+1+1+1 = 3

+1-1+1+1+1 = 3

+1+1-1+1+1 = 3

+1+1+1-1+1 = 3

+1+1+1+1-1 = 3

一共有5種方法讓最終目標和為3。

注意:

陣列的長度不會超過20,並且陣列中的值全為正數。

初始的陣列的和不會超過1000。

保證返回的最終結果為32位整數。

思路分析:最簡單粗暴的就是蠻力,直接深搜。

但是太慢了。。。

方法二:動態規劃。

假如我們將所有元素都看成一定重量的物品,[+,+,-,-,+,....+]則s代表的物理意義就是正號物品選擇一次,

負號物品不但不選擇並且還需要從揹包拿出同樣重量的物品。(當然s並不只是只有一種正負號向量,它有多種情況。)

所有元素的和sum,[+,+,+,....+]代表的物理意義是所有物品都選擇一次。

sum + s代表的物理意義,就是某些物品選擇兩次。(s中的負號物品與sum中對應的正號抵消,s中的正號物品將選擇兩次)

class

solution

//sum代表的含義是選擇所有物品,[+,+,+...+],因為所有物品都是加號

//s代表的所有物品求和去除某些物品的兩倍,[+,+,-,-,+....-],負號的物品不但不選還需要重揹包中取出同樣重量的物品

//sum + s代表的是s中選擇的物品選擇兩次,(s中負號物品與sum中對應的正號物品抵消,剩下的正號物品選擇了兩次)

long

long mys = sum + s;

if(sum < s || mys %2==

1)mys = mys /2;

//現在就是需要確定總重量為mys的情況數

vector<

int>

dp(mys +1,

0);//dp[i]代表的是湊出重量為i的情況數

dp[0]

=1;//進行動態規劃

leetcode 863 廣度優先和深度優先的應用

給定乙個二叉樹 具有根節點root 乙個目標節點target以及乙個整數值k,返回到目標結點target距離為k的所有結點的值的列表。答案可以以任何順序返回。示例 可以從示例中發現,這顆樹是用陣列儲存的,所以馬上想到了第乙個思路 遍歷陣列,找出目標值,然後再用 節點 i 的子節點是 2i 1 和 2...

leetcode 深度優先演算法

題目 給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 solution class solution if root....

深度優先和廣度優先

在爬蟲系統中,待抓取url佇列是很重要的一部分,待抓取url佇列中的url以什麼樣的順序排隊列也是乙個很重要的問題,因為這涉及到先抓取哪個頁面,後抓取哪個頁面。而決定這些url排列順序的方法,叫做抓取策略。下面是常用的兩種策略 深度優先 廣度優先 注 scrapy預設採用的是深度優先演算法 這裡是深...