思路
子序列是原序列通过删除>=0 个元素 重新获得的序列
假设序列长度为n, 全部子序列数量为 2n个
加入排序规则 按照序列和递增顺序,采用小根堆数据结构,获取第n个子序列和 时间复杂度为nlog(n)
-
链接:找出数组的第k大和
-
代码
typedef long long LL;
typedef pair<LL, LL> pii;
class Solution {
public:
long long kSum(vector<int>& nums, int k) {
priority_queue<pii, vector<pii>, greater<pii>> q;
LL maxx = 0; int n = nums.size();
for(int i = 0; i < n; i ++)
{
if(nums[i] >= 0) maxx += nums[i];
nums[i] = abs(nums[i]);
}
sort(nums.begin(), nums.end());
//{a,b} 序列和为a,序列最后一个是nums[b]
q.push((pii){nums[0], 0}); LL res = 0;// 省略放空集,从第2小开始
for(int i = 1; i < k; i ++)
{
auto [a, b] = q.top();
q.pop();
res = a;
if(b >= n-1) continue;
// push 规则是 每次在原基础上加入下一个 或者 去掉当前的然后再加入下一个,这样可以保证 每次加入的都比之前的大,并且不重不漏。
q.push({a+nums[b+1], b+1});
q.push({a-nums[b]+nums[b+1], b+1});
}
return maxx - res;
}
};