給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:每個陣列中的元素不會超過 100
陣列的大小不會超過 200
示例 1:
輸入: [1, 5, 11, 5]
輸出: true
解釋: 陣列可以分割成 [1, 5, 5] 和 [11].
思路:令陣列總和為sum
,將問題轉換為0-1揹包,在陣列中挑選若干個數求總和是否為sum/2
。
本文提供兩種方法dfs和動態規劃
動態規劃求解0-1揹包問題,令dp[i][j]
表示為前i
個數是否存在和為j
的組合。
當前數可以選
dp[i]
[j]=dp[i-1]
[j]||dp[i-1]
[j-nums[i]
]
當前數不能選
dp[i]
[j]=dp[i-1]
[j]
具體如下:
public
boolean
canpartition
(int
nums)
}return dp[nums.length]
[target]
;}
dfs解0-1揹包:
public
boolean
canpartition
(int
nums)
public
boolean
can(
int[
] nums,
int sum,
int index)
LeetCode每日一題 分割等和子集
題目 給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 f...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...