码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2386. 找出数组的第 K 大和 (每日一难phase2-day2)


    2386. 找出数组的第 K 大和

    给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。

    数组的 第 k 大和 定义为:可以获得的第 k 个 最大 子序列和(子序列和允许出现重复)

    返回数组的 第 k 大和 。

    子序列是一个可以由其他数组删除某些或不删除元素排生而来的数组,且派生过程不改变剩余元素的顺序。

    注意:空子序列的和视作 0 。

    示例 1:

    输入:nums = [2,4,-2], k = 5
    输出:2
    解释:所有可能获得的子序列和列出如下,按递减顺序排列:

    • 6、4、4、2、2、0、0、-2 数组的第 5 大和是 2 。

    示例 2:

    输入:nums = [1,-2,3,4,-10,12], k = 16
    输出:10
    解释:数组的第 16 大和是 10 。

    提示:

    n == nums.length
    1 <= n <= 1e5
    -1e9 <= nums[i] <= 1e9
    1 <= k <= min(2000, 2n)

    解析:

    • 最大的数一定是所有正数相加
    • 此大的数一定是拿最大的数减去一个正数或者加上一个负数(到底是减正数,还是加负数,当然谁的绝对值小减谁),本质上就是减去一个绝对值较小的数。因此,可以将所有的负数变成正数,统一操作为减去一个正数。
    • 求第k大数可以使用堆求得,此时需要将所有子序列列举出来(可以考虑使用dfs求所有子序列的情况,针对每个元素取或者不取)

    代码:

    class Solution {
    public:
        // 将所有子序列找出,优先队列求第k大
        long long kSum(vector<int>& nums, int k) {
            long long ans;
            long long sum=0;
            // 找出最大值,并将元素取绝对值
            for(auto &a : nums){
                if(a>=0) 
                    sum+=a; 
                else 
                    a = -a;
            }
            // 按照绝对值从小到大排序
            sort(nums.begin(),nums.end());
            priority_queue<pair<long long ,int>> pq;
            // 大根堆放入最大元素,及序号
            pq.push({sum,0});
            while(--k){
                auto [a,b] = pq.top();
                pq.pop();
                if(b<nums.size()){
                	// 舍弃当前元素,保留前一个元素
                    pq.push({a-nums[b],b+1});
                    // 舍弃当前元素,不保留前一个元素,把之前减去加回来
                    if(b) pq.push({a-nums[b]+nums[b-1],b+1});
                }
            }
            // k-1个最大已经排除,堆顶为第k
            return pq.top().first;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    代码参考:视频讲解

  • 相关阅读:
    Android11编译第二弹:USB连接MTP模式+USB调试+USB信任
    Qt之xml文件解析
    【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign
    基于普鲁克分析对两组相机/三维点(已知对应关系)进行相似变换对齐的方法及python代码
    VoLTE基础自学系列 | VoLTE实战分析之VoLTE注册流程
    1688API接口接入|阿里1688-B类电商基础链路专业化体验升级
    火炬之光无限-萌新记录
    任务调度 Quartzh 框架使用指南
    输入学生成绩(最多不超过40),输入为负值时表示输入结束,统计成绩高于平均成绩的学生人数
    什么是数据可视化,为什么数据可视化很重要?
  • 原文地址:https://blog.csdn.net/weixin_42051691/article/details/126593467
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号