算法思想:
对每一个数,可以选与不选,那么就可以得到所有的非空子序列的和。
例题:

class Solution {
typedef long long LL;
typedef pair<LL, int> pli;
public:
long long kSum(vector<int>& nums, int k) {
int n = nums.size();
LL sum = 0;
for(int i = 0; i < n; ++i){
if(nums[i] > 0) sum += nums[i];
else nums[i] = -nums[i];
}
sort(nums.begin(), nums.end());
priority_queue<pli> q;
q.push({sum, 0});
while(--k){
auto [sum, i] = q.top();
q.pop();
if(i < n){
q.push({sum - nums[i], i + 1}); //保留 nums[i - 1]
if(i > 0) q.push({sum + nums[i - 1] - nums[i], i + 1}); //不保留 nums[i - 1]
}
}
return q.top().first;
}
};
本文介绍了一种使用优先队列实现的算法,用于计算给定整数数组中,通过最多k次取反操作(将正数变为负数,反之亦然),求所有非空子序列之和的最大值。通过实例和代码展示了解决思路和实现过程。
952

被折叠的 条评论
为什么被折叠?



