解題思路
1. 如果 array 的總和是奇數,那麼不用想了,一定找不到能分兩半的組合
2. 接下來,題目被簡化成找 target = sum / 2 在 array 中是否有該組合
原本想用 set 做,traverse array[i] 的時候把新的可能加進去,但沒想到效率很慢。
改用 bool vector 來記錄 sum = i 的組合是否能找到。
程式碼
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int i=0; i<nums.size(); i++)
sum += nums[i];
if(sum % 2 == 1) return false;
int target = sum / 2;
vector<bool> dp(target + 1, false);
dp[0] = true;
for(int i=0; i<nums.size(); i++)
{
for(int j=target; j>=nums[i]; j--)
dp[j] = dp[j] || dp[j - nums[i]];
}
return dp[target];
}
};
沒有留言:
張貼留言