Leetcode2542-最大子序列的分数

1.问题转换 

        首先明确题意,要选取的值和num1,num2两个数组都有关,但是num1中选取的是k个数,num2中选取的是1个数,显然num2中的数所占的权重较大(对结果影响较大),所以我们就可以对num2进行排序(也可以对nums1进行排序,就是对nums1排列以后枚举时获取nums2最小值特麻烦,就不再赘述了,有兴趣的读者可以思考一下),枚举num2中的每个数,然后确定num1中对应的k个数,但是选取元素时 num1 和 num2 对应的索引要一样,所以不能对num2直接排序,那么就对num2所对应的索引进行排序即可,对num2的索引,按照num2的值从大到小进行排序,为什么从大到小,因为要过滤在num2中前k-1个数,在第k个数进行计算,看到下文便可知

        int len = nums1.length;Integer[] ids = new Integer[len];for (int i = 0; i < len; i++) {ids[i] = i;}//按照nums2[]  数组元素降序后排列的下标Arrays.sort(ids, (i, j) -> nums2[j] - nums2[i]);

进行这样的排序之后,所得到的效果就是  nums2[ids[0]]  就是nums2中最大的元素,nums2[ids[1]]就是num2中第二大的元素...     

        要设计一个小顶堆,确保这k个数在遍历时,是遍历到的最大值,如果每次遇到一个值比堆顶元素大,那么就替换堆顶元素,并且定义一个变量 sum 记录堆中元素的总和,便于计算

2. 要理解的三个点

A.  nums2[ids[i]]   i 从 0 -> len - 1  遍历   nums2[ids[i]] 就是降序的

B.  要从nums2[] 中第k大的元素  x  开始遍历,如果选了前面的数(比x大的数),那么nums1[] 就凑不出k个数满足配件,例如图片中的例子,如果选了nums2中最大的数4,对应的下标只有一个3,就凑不出3个下标,因为4在nums2中就是最大的,不存在两个比4小的数

C.  nums1[]  nums2[]  中选取的下标都是一样的,nums2[ids[i]]  选取的下标是 ids[i]    那么nums1[] 选取的下标也得是ids[i],  所以先把 前k个 ids[i] 所以对应的nums1[] 的元素入小顶堆

3. 代码编写

        首先就是将num2的最大值索引映射到ids上,这样  i 从 0 -> len - 1  遍历   nums2[ids[i]] 就是降序的,因为必须从num2中的第k个元素开始计算(至于为什么,看第二点),所以就跳过前k个num2中最大的数(跳过的索引为ids[0....k-1]),对应的就把num1[ids[0.....k-1]]  这些元素入堆,并且计算和,此时已经有第一个结果,就定义res存储这个结果。

        因为通过k你已经确定了nums2的最大值了,因为位置是共同变换的,所以相应的nums1的和就是初始值,但是这个答案不一定是最大的,那么我们就需要往后选,num2往后选必然会越来越小,所以影响答案的是num1新加的数,不光要维护nums2最小值,还要维护nums1的和,每次都会新加一个数,小根堆维护的最小的k个元素,当加入的元素要比最小的小的话就更新

        然后就是遍历剩下的nums2中的len-k个元素,也就是比nums2[ids[k-1]] 小的元素,此时对应的小顶堆中维护的num1[] 中的值也应该发生变化,因为nums2[] 的索引发生了变化,如果nums1[ids[i]] > minHeap.peek()  那么就弹出堆顶元素,将nums1[ids[i]]入堆,确保堆中元素是遍历过的元素里面最大的k个元素,同时更新res和sum,具体代码如下

    public static long maxScore(int[] nums1, int[] nums2, int k) {//需要以及难理解的3点://1. nums2[ids[i]]   i 从 0 -> len - 1  遍历   nums2[ids[i]] 就是降序的//2. 要从nums2[] 中第k大的元素  x  开始遍历,如果选了前面的数(比x大的数),那么nums1[] 就凑不出k个数满足配件//3. nums1[]  nums2[]  中选取的下标都是一样的,nums2[ids[i]]  选取的下标是 ids[i]    那么nums1[] 选取的下标也得是ids[i]//   所以先把 前k个 ids[i] 所以对应的nums1[] 的元素入小顶堆int len = nums1.length;Integer[] ids = new Integer[len];for (int i = 0; i < len; i++) {ids[i] = i;}//想要对nums2[]  进行排序,但是对应的索引不能边,就对索引按照nums2的元素从大到小进行排序Arrays.sort(ids, (i, j) -> nums2[j] - nums2[i]);//从 0 -> len   遍历nums2[ids[i]]          就得到的是nums2从大到小遍历的结果//直接获取nums1中最大的前k个数即可PriorityQueue<Integer> minHeap = new PriorityQueue<>();long sum = 0;for (int i = 0; i < k; i++) {sum += nums1[ids[i]];minHeap.add(nums1[ids[i]]);}// 枚举的nums2[] 中的最大值,一定不是整个数组的最大值,而是nums2中的第k大的值,// 这样的话,nums1中才能找到k个与之对应的元素,如果找nums2中最大值,那么对应的nums1中的值只有一个// 所以必须得从nums2的第k大个元素开始,枚举的num2一直变小,然后对应的minHeap中的值变大long res = sum * nums2[ids[k - 1]];for (int i = k; i < len; i++) {int x = nums1[ids[i]];if (x > minHeap.peek()) {sum += x - minHeap.poll();minHeap.add(x);res = Math.max(res, nums2[ids[i]] * sum);}}return res;}

4.总结

        说实话,这道题我认为还是挺不好理解的,我自己刷的时候也思考了很久,这个问题转换是这道题的核心,需要注意的三个点必须理清楚(尤其是必须从第k大的元素开始计算,还有两个数组所选取元素的索引是一样的),建议读者反复观看

        这道题我没见过的点是:想要对一个数组进行排序,但是又想让其对应的索引不变,就创建一个索引数组,让这个索引数组按照待排序数组的元素大小,升序或者降序排列,这样就把num2数组排序后的结果,映射到了ids数组中

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

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

相关文章

【Java探索之旅】多态:向上下转型、多态优缺点、构造函数陷阱

文章目录 &#x1f4d1;前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯&#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;向上转型和向下转型是常用…

Django 新增数据 create()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

小米订单锐减背后的挑战与应对之道

近期&#xff0c;富士康印度子公司Bharat FIH面临高管离职、工厂关闭的困境&#xff0c;其背后原因之一是小米订单的显著下滑&#xff0c;据报道&#xff0c;这一降幅高达70%。这一现象不仅反映了富士康在印度市场的艰难处境&#xff0c;也揭示了小米在全球智能手机市场面临的挑…

六、数据可视化—Wordcloud词云(爬虫及数据可视化)

六、数据可视化—Wordcloud词云&#xff08;爬虫及数据可视化&#xff09; 也是一个应用程序 http://amueller.github.io/word_cloud/ Wordcloud词云&#xff0c;在一些知乎&#xff0c;论坛等有这样一些东西&#xff0c;要么做封面&#xff0c;要么做讲解&#xff0c;进行分析…

C++ | Leetcode C++题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution { public:int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth min(ax2, bx2) - max…

实战Qt开发WordBN笔记软件#01 搭建开发环境:VS2019+Qt6.5+CMake+Git

01 背景 【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件&#xff1b;WordBN基于VS2019、Qt6.5开发&#xff0c;使用Qt Quick&#xff08;QML&#xff09;开发语言。 本课程将以【WordBN字远笔记】的界面为实战基础&#xff0c;详细介绍如何基于Qt/QML开发语言&am…

WPF 表格控件斑马线使用

这里用ListView为案例。 如图效果&#xff1a; 主要思路&#xff1a; 用AlternationCount属性来设置需要使用斑马线的条数&#xff0c;就是说几行一换色&#xff0c;也可以理解为需要几种颜色&#xff0c; 然后再样式模板中&#xff0c;写触发器属性ItemsControl.Alternatio…

明明已经安装了python中的某个库,但是还是报错ModuleNotFoundError: No module named ‘sklearn‘

问题&#xff1a; 明明已经安装了python中的某个库&#xff0c;但是还是报错ModuleNotFoundError: No module named sklearn 解决方法&#xff1a; 卸载重新安装一下即可 pip uninstall scikit-learn pip install scikit-learn 成功解决&#xff01;&#xff01;&#xff…

《Windows API每日一练》9.1 资源-图标

本节讲述图标、鼠标指针位图、字符串资源表、自定义资源的添加和应用。 本节必须掌握的知识点&#xff1a; 图标 第56练&#xff1a;ICON图标资源 鼠标指针位图 字符串资源表 自定义资源 第57练&#xff1a;字符串资源表和自定义资源 9.1.1 图标 在 Windows 窗口编程中&…

知识付费系统3.0整站源码知识付费网课平台网创资源付费带自动采集同步插件

程序说明&#xff1a; 1.修复更新到最新版本 2.自动采集插件重写 3.关闭采集授权域名直接对接 4.更新插件主动请求同步资源 5.带自动采集插件 原始功能 支持分类替换 将主站同步过来的文章分类进行替换 支持自定义文章作者&#xff08;选择多个作者则同步到的文章作者将会随机分…

java中==和equals()的区别探究

目录 一、Object对象 二、 三、String类的equals()方法 四、示例 4.1直接定义两个相同的值比较 4.2直接定义两个值不同的字符串进行比较 4.3直接定义一个字符串和new一个字符串进行比较&#xff08;两者值相同&#xff09; 4.4直接定义一个字符串和new一个字符串进行…

Halcon Ean13 一维码读取

一 EAN码介绍 1 EAN码定义: EAN码是国际物品编码协会制定的一种商品用条码&#xff0c;通用于全世界。EAN码符号有标准版&#xff08;EAN-13&#xff09;和缩短版&#xff08;EAN-8&#xff09;两种。标准版表示13位数字&#xff0c;又称为EAN13码&#xff0c;缩短版表示8位数…

VScode免密链接ubuntu

Ubuntu 下载&#xff1a; sudo apt-get install openssh-serverps -e | grep sshd参考IP &#xff1a; ifconfig VScode配置 重新尝试连接&#xff0c;输入的密码是虚拟机用户密码 免密链接 Windows生成公钥 1、打开CMD 2、输入命令ssh-keygen 3、连续回车确认即可生成 …

正态、威布尔、指数分布、伽马分布、对数正态分布介绍

目录 正态、威布尔、指数分布、3.1 概念介绍概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09;性质应用 3.2 参数及绘图参数概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09;绘图图像解读 3.3 指数分布拟合代码…

第11章 规划过程组(二)(11.10制订进度计划)

第11章 规划过程组&#xff08;二&#xff09;11.10制订进度计划&#xff0c;在第三版教材第395~397页&#xff1b;文字图片音频方式 第一个知识点&#xff1a;定义及作用 分析活动顺序、持续时间、资源需求和进度制约因素&#xff0c;创建项目进度模型&#xff0c;从而落实项目…

Docker定时清理

一、循环调度执行 1、检查cron状态 systemctl status crond 2、创建要执行的shell脚本 vim /home/cleanup_docker.sh #! /bin/bash # 清理临时文件 echo $(date "%H:%M:%S") "执行docker清理命令..." docker system prune -af-a 清理包括未使用的镜像 …

Android EditText+ListPopupWindow实现可编辑的下拉列表

Android EditTextListPopupWindow实现可编辑的下拉列表 &#x1f4d6;1. 可编辑的下拉列表✅步骤一&#xff1a;准备视图✅步骤二&#xff1a;封装显示方法✅步骤三&#xff1a;获取视图并监听 &#x1f4d6;2. 扩展上下箭头✅步骤一&#xff1a;准备上下箭头icon图标✅步骤二&…

Redisson分布式锁、可重入锁

介绍Redisson 什么是 Redisson&#xff1f;来自于官网上的描述内容如下&#xff01; Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了…

北森锐途人才竞聘盘点管理测评:高管领导力六大评判标准深度解析万达商管中国绿发等

北森锐途人才管理测评&#xff1a;高管领导力评判标准深度解析 在企业高管的盘点与竞聘测评领域&#xff0c;众多管理人才面临评估自身领导力的挑战。面对能力卓越、职级显赫的同僚&#xff0c;许多管理者感到缺乏一套权威且专业的评价体系。然而&#xff0c;无论是天赋异禀的领…

vue+cesium之加载天地图影像底图与注记

目录 1.创建地图容器2.叠加天地图影像底图与矢量注记 关键代码3.示例效果图 Cesium是默认加载了微软公司的Bing地图&#xff0c;并提供了BingMapslmageryProvider类来加载Bing地图。也就是说&#xff0c;在创建Viewer时&#xff0c;如果不指定lmageryProvider类就默认加载Bing地…