Leetcode2542-最大子序列的分数

news2024/9/21 2:44:23

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.coloradmin.cn/o/1907401.html

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

相关文章

猫咪浮毛满天飞怎么办?希喂、352、米家养猫空气净化器对比测试

作为一名资深铲屎官&#xff0c;表现掉毛季又来了&#xff0c;猫咪的毛发满天飞&#xff0c;怎么办&#xff1f;我家里的猫咪一到换毛季就掉满地的毛发&#xff0c;尤其喜欢在家里奔跑打闹&#xff0c;结果整个房间都是毛。家里的猫掉毛特别严重&#xff0c;感觉随便咳两下就能…

前端web在线PPT编辑器-PPTLIST

哈喽&#xff0c;大家好&#xff0c;今天给大家介绍一款的在线的PPT编辑器开源框架-PPTLIST&#xff1b;他是一个基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;支持 文字、图片、…

[FBCTF2019]RCEService

[FBCTF2019]RCEService 绕过正则 随便输一下Json格式的东西 发现了get方式的cmd参数 然后{"cmd":"ls /"}没回显应该是被过滤了 {"cmd":"ls"}正则函数preg_match只能匹配第一行 Linux中cat命令实际是在bin中 ?cmd{%0a"cmd&quo…

微信小程序开发-003-首页(轮播图,状态栏,导航栏)

哈喽小伙伴们大家好,我是程序媛小李,今天,我们继续来开发微信小程序. 在这里,先贴上首页的效果图: 整个页面大概可以分为顶部的状态栏区域,轮播图区域,公司信息区域,商品导航区域,商品推荐区域,以及最下面的导航栏区域. 一,底部导航栏 在这里,我们遵循从外到内的原则,我们先来…

【力扣: 15题: 三数之和】

15题: 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 …

回归损失和分类损失

回归损失和分类损失是机器学习模型训练过程中常用的两类损失函数&#xff0c;分别适用于回归任务和分类任务。 回归损失函数 回归任务的目标是预测一个连续值&#xff0c;因此回归损失函数衡量预测值与真实值之间的差异。常见的回归损失函数有&#xff1a; 均方误差&#xff…

参考人物和背景生成惊艳图片,comfyui风格工作流!

前言 轻松使用ComfyUI生成惊艳图片&#xff1a;快速指南 在这篇文章中&#xff0c;我们将分享如何使用ComfyUI工作流轻松生成高质量的图像。这一过程不仅适合专业的设计师&#xff0c;同样也适用于刚开始接触图像生成技术的用户。通过本文&#xff0c;你将了解如何利用ComfyU…

CSS--表格自适应宽度并设置最小宽度

原文网址&#xff1a;CSS--表格自适应宽度并设置最小宽度_IT利刃出鞘的博客、-CSDN博客 简介 本文介绍怎样让HTML的表格自适应宽度。 Java技术星球&#xff1a;way2j.com 问题描述 默认样式下&#xff0c;表格会出现某一列很窄的情况&#xff1a; 代码&#xff1a; <h…

Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同

探索智能体Agent的未来之路&#xff1a;Function Call与ReACT框架的较量&#xff0c;谁能引领未来&#xff1f; 引言 各大平台出现智能体应用创建&#xff0c;智能体逐渐落地&#xff0c;背后的使用哪种框架&#xff1f; 随着各大平台&#xff0c;例如百度千帆APPbuilder、阿…

Python入门 2024/7/8

目录 数据容器 dict(字典&#xff0c;映射) 语法 定义字典字面量 定义字典变量 定义空字典 从字典中基于key获取value 字典的嵌套 字典的常用操作 新增元素 更新元素 删除元素 清空字典 获取全部的key 遍历字典 统计字典内的元素数量 练习 数据容器的通用操作…

浏览器控制台打印日志的方法汇总

目录 console.table用法 打印数组 打印对象 打印数组对象 打印数组对象里的指定字段 console.count用法 不传参打印 传参打印 console.warn用法 打印文本 打印对象 console.error用法 打印文本 打印对象 console.assert用法 打印文本 打印对象 consol…

ACL 2024|D2LLM:将Causal LLM改造成向量搜索模型的黑科技

语义搜索任务的主要挑战是创建既准确又高效的模型来精准定位与用户查询相关的句子。基于BERT风格的双编码器因为可以使用预先计算的嵌入表示时效率很高&#xff0c;但它们往往会错过句子对的微妙关系。相反&#xff0c;基于 GPT 风格的大语言模型&#xff08;LLM&#xff09;采…

【Python基础篇】条件判断和循环判断

文章目录 1. 条件判断1.1 单分支1.2 双分支1.3 多分支 2. 循环判断2.1 while2.2 for2.3 break2.4 continue 1. 条件判断 1.1 单分支 前面学习了打印&#xff0c;但是有时候我们在打印时会面临选择&#xff0c;例如&#xff1a;一个网吧&#xff0c;未满18&#xff0c;禁止进入…

将QT移植到IMX6ULL开发板

文章目录 前言一、编译系统1.设置交叉编译工具链2.编译系统3.烧写 二、Linux中下载QT1.安装 Qtcreator2.创建第一个程序3.配置 QtCreator 开发环境&#xff08;1&#xff09;打开选项界面&#xff08;2&#xff09;选择编译器&#xff08;3&#xff09;设置编译器&#xff08;4…

【Go】函数的使用

目录 函数返回多个值 init函数和import init函数 main函数 函数的参数 值传递 引用传递&#xff08;指针&#xff09; 函数返回多个值 用法如下&#xff1a; package mainimport ("fmt""strconv" )// 返回多个返回值&#xff0c;无参数名 func Mu…

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

大语言模型的应用探索AI Agent初探!

前言 大语言模型的应用之一是与大语言模型进行聊天也就是一个ChatBot&#xff0c;这个应用已经很广泛了。 接下来的一个应用就是AI Agent。 AI Agent是人工智能代理&#xff08;Artificial Intelligence Agent&#xff09;的概念&#xff0c;它是一种能够感知环境、进行决策…

PL/SQL安装+汉化教程

PL/SQL安装教程 一、安装&#xff1a; 登陆官网&#xff1a;PL/SQL Developer - Allround Automations下载 下载PL/SQL稳定版本12.0.7 根据自己计算机版本安装相适配的版本。我这里安装X64-bit版本 进行安装&#xff1a; 根据情况去更改安装&#xff0c;我这里全部下一步…

服务注册Eureka

目录 一、背景 1、概念 2、CAP 理论 3、常见的注册中心 二、Eureka 三、搭建 Eureka Server 1、搭建注册中心 四、服务注册 五、服务发现 六、Eureka 和 Zooper 的区别 一、背景 1、概念 远程调用就类似于一种通信 例如&#xff1a;当游客与景区之间进行通信&…