生成子序列和 有序的nlog(n) 算法

思路

子序列是原序列通过删除>=0 个元素 重新获得的序列
假设序列长度为n, 全部子序列数量为 2n
加入排序规则 按照序列和递增顺序,采用小根堆数据结构,获取第n个子序列和 时间复杂度为nlog(n)

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

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 14:24:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 14:24:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 14:24:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 14:24:05       20 阅读

热门阅读

  1. rust引用-借用机制扩展

    2024-03-10 14:24:05       19 阅读
  2. MySQL 8.0 架构 之 DDL日志(元数据日志)(DDL log)

    2024-03-10 14:24:05       20 阅读
  3. Unity3D 实现大世界地图的技术原理详解

    2024-03-10 14:24:05       20 阅读
  4. IOS面试题object-c 1-10

    2024-03-10 14:24:05       23 阅读
  5. iOS面试题

    2024-03-10 14:24:05       22 阅读
  6. [论文笔记] Open-sora 2、视频数据集介绍 MSR-VTT

    2024-03-10 14:24:05       23 阅读
  7. android 快速实现 recyclerview 的所有item 都执行动画

    2024-03-10 14:24:05       21 阅读
  8. 2024.3.9 C++启航 梦开始的地方

    2024-03-10 14:24:05       23 阅读