給定乙個非負整數陣列,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預設採用的是深度優先演算法 這裡是深...