求数组所有非空子序列的和

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

例题:

求数组所有非空子序列的和_第1张图片

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;
    }
};

你可能感兴趣的:(Leetcode,算法,leetcode,数据结构)