lc1755 最接近目標值的子序列和

chenfy27發表於2024-03-14

給你一個整數陣列nums和一個目標值goal,需要從nums中選出一個子序列,使子序列元素總和最接近goal,返回abs(sum-goal)可能的最小值。陣列的子序列指透過移除原陣列中的某些元素(可能全部或無)而形成的陣列。
1<=nums.length<=40; -1e7<=nums[i]<=1e7; -1e9<=goal<=1e9

值域過大,不能用揹包求,而直接dfs時間複雜度為O(2^40),會TLE,考慮雙向dfs,然後湊答案,時間複雜度為O(2*2^20)

class Solution {
public:
    int minAbsDifference(vector<int>& nums, int goal) {
        int n = nums.size();
        set<int> st1, st2;
        
        auto dfs = [&](auto self, int x, int R, int cur, set<int> &st) -> void {
            if (x == R) {
                st.insert(cur);
                return;
            }
            self(self, x+1, R, cur, st);
            self(self, x+1, R, cur+nums[x], st);
        };
        
        dfs(dfs, 0, n/2, 0, st1);
        dfs(dfs, n/2, n, 0, st2);
        int ans = INT_MAX;
        for (auto i : st1) {
            auto it = st2.lower_bound(goal-i);
            if (it != st2.end()) {
                ans = min(ans, abs(i + *it - goal));
            }
            if (it != st2.begin()) {
                --it;
                ans = min(ans, abs(i + *it - goal));
            }
        }
        return ans;
    }
};

相關文章