每日一题leetcode-找出数组的第K大和

一.题目解析

读完题目后我们知道,该题就是让我们在子序列中求和,我们要在不同的子序列中排序找到第K大的和。何为子序列?

子序列就是在一个数组中抽出一些元素构成一个新的数组即可,不要求一定是连续的;

例如:数组【4,5,6】,子序列有【4】【5】【6】【】【4,5】【4,6】【5,6】【4,5,6】我们其实就可以发现,一个数组中有N个元素,那么每个元素都会面临着选或者不选两种情况,那么一共就有2的N次方个子序列。

二.思路解析

1.找到数组子序列的第K大和,那我们就先想到,最大的和是谁?

最大的和当然是所有的正整数相加得到的和。

那么第二大和呢?一定是最大的和减去一个最小的正数,或者加上一个最大的负数就可以得到了。

所以我们第一步一定要把所有正整数的和求出来,令其为sum1,然后我让所有数组中所有元素排列好大小顺序,只要我找到了数组中子序列加起来的第K小的和sum2,让sum1-sum2我就知道了第K大的序列和。

问题又来了,我怎么找到最小的正数或者最大的负数?我又怎么知道他们的第K小的子序列?

如上图中,我们会发现最小的正数所在的位置和最大的负数位置是不好确定的(找到数组中最小的正整数后,找到其下标,然后再往左找负数,往右找正数,还要比较,非常麻烦)。所以我们再次 看到上面红色的那句话那么第二大和呢?一定是最大的和减去一个最小的正数,或者加上一个最大的负数就可以得到了。我们会发现,减去一个正数或者加上一个负数,不都是减去一个数的绝对值吗?无非还是一个在子序列中选不选的问题。所以我们在求出SUM1后,可以让数组全都带上绝对值,然后再排列好。

    long sum1 = 0L;for (int &x : nums){if (x >= 0) {sum1 += x;} else{x = -x;}}sort(nums.begin(),nums.end());

 

 例如上述例子,Sum1=24,我要找其第二大的序列和,也就是在新数组中找到第二小的序列和,第二小的序列号很明显是1。所以第二大的序列和就是23,实际意义是选了所有正整数后,再选了一个-1.

我要找第3大的序列和呢? 也就是在新数组中找到第三小的序列和,很明显是2.所以第三大的序列和就是22,实际意义是选了所有正整数后,我再选一个-2,或者是除了正2以外,所有正整数我都选。   所以我们知道,绝对值数组排列后,找到其第K小的序列和sum2,就是在原数组中最大和sum1可以选择一些正数不选,也可以选择一些负数选上。

接下来我们又回到问题的核心,在这个绝对值数组中,找到其子序列第K小的和,top—K问题我们一般都是用堆来解决。

每个元素都可以选或者不选,那么我们如何不重不漏的列出所有的子序列呢?

参考这种方法

也就是构造一个优先级队列。这个队列中的元素类型是一个pair(long,int),pair.first是子序列的和,pair.second是选完下一个要添加或者替换的元素下标。

构造一个小顶堆,堆中大于当前节点的元素需要下沉,因此使用greater

priority_queue<pair<long, int>, vector<pair<long, int>>, greater<>> pq;

堆中一定有的一个元素是全都不选的0

所以

   pq.emplace(0, 0); // 空子序列

 找第K小子序列方法:

while (--k) {auto [s, i] = pq.top();pq.pop();if (i < nums.size()) {// 在子序列的末尾添加 nums[i]pq.emplace(s + nums[i], i + 1); // 下一个添加/替换的元素下标为 i+1if (i) { // 替换子序列的末尾元素为 nums[i]pq.emplace(s + nums[i] - nums[i - 1], i + 1);}}}

 最终返回:

 return sum1 - pq.top().first;

三.最终代码: 

class Solution {
public:long long kSum(vector<int> &nums, int k) {long sum1 = 0L;for (int &x : nums) {if (x >= 0) {sum1 += x;} else {x = -x;}}sort(nums.begin(),nums.end());priority_queue<pair<long, int>, vector<pair<long, int>>, greater<>> pq;pq.emplace(0, 0); // 空子序列while (--k) {auto [s, i] = pq.top();pq.pop();if (i < nums.size()) {// 在子序列的末尾添加 nums[i]pq.emplace(s + nums[i], i + 1); // 下一个添加/替换的元素下标为 i+1if (i) { // 替换子序列的末尾元素为 nums[i]pq.emplace(s + nums[i] - nums[i - 1], i + 1);}}}return sum1 - pq.top().first;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析汽车MCU的软件架构

一、背景知识 电动汽车&#xff08;EV&#xff09;正在成为首选的交通方式&#xff0c;为传统内燃机汽车提供了一种可持续发展的环保型替代方案。在电动汽车复杂的生态系统中&#xff0c;众多电子控制单元&#xff08;ECU&#xff09;在确保其高效运行方面发挥着至关重要的作用…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

最优算法100例之03-判断是否是栈的弹出序列

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例…

20、电源管理入门之Hypervisor中的电源管理

目录 1. Hypervisor概念介绍 2. 汽车软件中的Hypervisor应用 3. QNX Hypervisor 4. Hypervisor中的多OS通信技术 5. 电源管理相关 参考: 很多时候听说Hypervisor,但是对底层软件技术不了解的人感觉挺神秘。本篇文章简单介绍下Hypervisor的基本概念,另外介绍下电影管理…

从零开始:神经网络(2)——MP模型

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 神经元相关知识&#xff0c;详见从零开始&#xff1a;神经网络——神经元和梯度下降-CSDN博客 1、什么是M-P 模型 人…

《剑指 Offer》专项突破版 - 面试题 76 : 数组中第 k 大的数字(C++ 实现)

目录 详解快速排序 面试题 76 : 数组中第 k 大的数字 详解快速排序 快速排序是一种非常高效的算法&#xff0c;从其名字可以看出这种排序算法最大的特点是快。当表现良好时&#xff0c;快速排序的速度比其他主要对手&#xff08;如归并排序&#xff09;快 2 ~ 3 倍。 快速排…

浏览器与Node.js事件循环:异同点及工作原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

记一次项目所学(中间件等)-动态提醒功能(RocketMQ)

记一次项目所学(中间件等&#xff09;–动态提醒功能&#xff08;RocketMQ&#xff09; 订阅发布模式与观察者模式 RocketMQ&#xff1a;纯java编写的开源消息中间件 高性能低延迟分布式事务 Redis : 高性能缓存工具&#xff0c;数据存储在内存中&#xff0c;读写速度非常快 …

Meta正打造一个巨型AI模型,旨在为其“整个视频生态系统”提供动力,一位高管透露

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Swift 入门学习:集合(Collection)类型趣谈-上

概览 集合的概念在任何编程语言中都占有重要的位置&#xff0c;正所谓&#xff1a;“古来聚散地&#xff0c;宿昔长荆棘&#xff1b;游人聚散中&#xff0c;一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理&#xff0c;怎能不让…

tcp流式服务和粘包问题

目录 1.概念 2.流式服务 3.粘包问题 1.概念 套接字是一个全双工的 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输. TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成…

【C语言】linux内核ip_local_out函数

一、讲解 这个函数 __ip_local_out 是 Linux 内核网络子系统中的函数&#xff0c;部分与本地出口的 IPv4 数据包发送相关。下面讲解这段代码的每一部分&#xff1a; 1. 函数声明 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)&#xff1a; -…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错&#xff1f;2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口&#xff1f;5.使用TypeScript开发react项目&#xff1a;6.要使一个组…

SQLite3中的callback回调函数注意的细节

调用 sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)该例程提供了一个执行 SQL 命令的快捷方式&#xff0c; SQL 命令由 sql 参数提供&#xff0c;可以由多个 SQL 命令组成。 在这里&#xff0c; 第一个参数 sqlite3 是打开的数据库对…

代码随想录算法训练营第day41|背包理论基础、416. 分割等和子集

目录 a.背包理论基础——01背包 1.二维数组的01背包表示 2.一维滚动数组表示 b. 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; a.背包理论基础——01背包 背包问题分类&#xff1a; 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff…

Excel F4键的作用

目录 一. 单元格相对/绝对引用转换二. 重复上一步操作 一. 单元格相对/绝对引用转换 ⏹ 使用F4键 如下图所示&#xff0c;B1单元格引用了A1单元格的内容。此时是使用相对引用&#xff0c;可以按下键盘上的F4键进行相对引用和绝对引用的转换。 二. 重复上一步操作 ⏹添加或删除…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器&#xff0c;可以构建灵活高效的查询条件&#xff0c;可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xf…

首屏性能优化:提升用户体验的秘籍

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

复盘-excel

excel-选列没有用&#xff0c;选小标题才可以 将簇状柱形图放置在一个新表上##### excel: 添加数据模型时&#xff0c;要通过套用表格格式与外部断开连接 透视分析2010年人数未解决(第四套&#xff09; 通过日期显示星期几 判断星期几 因为前面已经通过星期六&#xff0c…

03_Tomcat

文章目录 Tomcat概念自制简易的服务器JavaEE规范Tomcat安装Tomcat启动Tomcat的资源部署直接部署虚拟映射 Tomcat的设置 Tomcat 概念 服务器&#xff1a;两层含义。 软件层面&#xff1a;软件&#xff0c;可以将本地的资源发布到网络中&#xff0c;供网络上面的其他用户来访问…