[Leetcode] 416. Partition Equal Subset Sum (C++)
質問する
416. Partition Equal Subset Sum
コード#コード#
// dfs - Time Limit Exceeded
class Solution {
public:
bool canPartition(vector<int>& nums) {
int target = accumulate(nums.begin(), nums.end(), 0);
if (target%2 == 1) return false;
return recur(nums, 0, 0, target/2);
}
bool recur(vector<int>& v, int idx, int cur, int target){
if (cur == target) return true;
for (int i = idx; i < v.size(); i++){
if (cur+v[i] <= target and recur(v, i+1, cur+v[i], target)) return true;
}
return false;
}
};
// Accepted
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = accumulate(nums.begin(), nums.end(), 0), target = sum >> 1;
if (sum & 1) return false;
vector<int> dp(target + 1, 0);
dp[0] = 1;
for(auto num : nums)
for(int i = target; i >= num; i--)
dp[i] = dp[i] || dp[i - num];
return dp[target];
}
};
に近づく
まず、2つのサブセットの和は同じでなければならないので、合計は偶数でなければなりません.また、この要素を持っていなければ、誰もが答えを得ることができると思っていましたが、実際には、答えは得ることができます.しかし制限事項から分かるように、入力配列の大きさが200以下であるため、配列の長さが200であれば時間複雑度はO(n^200)であるべきだと思い、実際にタイムアウトしていた.
だからdpで彼に近づくべきだと思います.一見指数時間の複雑さが出ていないので試してみました.最終的に目標を達成できるかどうかが重要な部分なので、それを確認できる案を制定しました.targetを現在の値に表示しながら、現在の値から減算された値、すなわち現在の位置、または要素に到達可能な位置が1であるかどうかを確認します.1に設定すると、この値が達成できることを意味します.また,0は常に到達可能であるため,初期化は1とする.
Reference
この問題について([Leetcode] 416. Partition Equal Subset Sum (C++)), 我々は、より多くの情報をここで見つけました https://velog.io/@keybomb/Leetcode-416.-Partition-Equal-Subset-Sum-Cテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol