給你一個整數陣列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;
}
};