[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とする.