【LeetCode75】第五十一题 最大子序列的分数

news2024/11/23 23:49:44

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们两个长度一样的数组,让我们再num1中找出一个长度为k的子序列,然后把这个子序列累加的和乘上在nums2中对应下标的子序列里的最小值,这边两个子序列的下标在原数组中是一模一样的,要求nums1子序列的和乘上nums2子序列最小值的和要最大。

我们先分析,我们要求的值是受两个因素影响的,第一个就是nums1中子序列的和,第二个就是nums2中子序列的最小值。我们要寻找nums1中和最大的子序列那倒还好找,不不过我们还要兼顾nums2中子序列的最小值,不然nums1的子序列是大了,nums2中最小值给你来个0,那还是白搭。

另外题目还算是降低难度了,有保证数组的值都是非负数,所以我们不必考虑负数的情况。

根据我们上面的推断,nums2中子序列的最小元素的权重比nums1中子序列的元素更高,因此我们选择对nums2进行排序,但是有个问题,不能直接排序,因为排序以后之前的顺序就乱了,而题目是要求两个数组的子序列是要求在原数组中的下标是要一致的。

那我们还能排序吗?

答案是可以的,我们只需要对下标排序就好了。

我们另外拿一个数组来存放下标,然后对这个数组按照nums2的大小进行排序,这么说有点不好理解,大家可以结合着动图看一下。

 排完序的存放下标的数组映射到nums2中就是排完序的nums2了,而nums2是没有发生改变的,我们直接遍历存放下标的数组就可以得到从小到大或是从大到小的nums2了。

那么我们就解决了nums2的问题,接下来就剩下了nums1,我们需要让nums1的子序列总和尽可能的大,但是没有要求是要连续的子序列,所以我们直接获取nums1中最大的前k个数就行。不过由于nums2的子序列权重较大,所以我们应该优先考虑nums2的子序列,所以nums1的获取就不能只取nums1中最大的元素,还应该考虑上nums2。

那么说了一大堆,我们到底应该怎么处理呢?

我们可以直接按照nums2递减的下标来获取nums1的元素,而不去管这个nums1的元素是多大多小,我们直接把元素塞进小顶堆里,然后累加到小顶堆内元素总和表示nums1子序列的元素中和,每次小顶堆大小超过K了,我们就吐出一个数,保证nums1的子序列长度为K,并将nums1子序列总和减去这个数,因为是小顶堆,所以每次吐出的数的整个小顶堆里最小的,那么我们留在小顶堆里的元素就是nums1里较大的元素了。

每次我们是从大到小遍历nums2的下标,所以我们每次遍历到的下标在nums2里的元素,就是nums2子序列里的最小元素,所以只要当小顶堆的长度等于K了,我们就把累加的nums1子序列的元素总和乘上当前遍历到的nums2的元素,再去更新最终答案为较大的值即可。

另外可能还会有小伙伴有疑问,为什么按照nums2从大到小的顺序去遍历下标呢?明明我们需要nums2子序列里的元素最小值越大越好,而按照从大到小的顺序,由于刚开始小顶堆的长度小于K,所以我们是没法更新答案的,也就是没法利用到nums2里较大的元素的。

其实我们不可能用到nums2中前K-1大的元素,因为子序列长度是固定死为K的,那么我们就算我们把nums2中最大的元素都塞进去了,那么最多也只能用到第K大的元素,所以我们按照nums2从大到小的顺序遍历下标,如果是反过来的,我们就没法保证我们用的nums2元素是子序列里最小的元素了。

代码:

class Solution {
public:
    long long maxScore(vector<int>& nums1, vector<int>& nums2, int k) {
        int n = nums1.size();
        vector<int>temp(n);
        for (int i=0;i<n;i++) temp[i]=i;   //初始化一下每个位置的下标
        //对下标进行排序,从而不改变原数组(nums2)
        sort(temp.begin(),temp.end(),[&](const int &i,const int &j){   
            return nums2[i]>nums2[j];
        });
        priority_queue<int,vector<int>,greater<int>> minHeap;//小顶堆 
        long long sum=0,res=0;
        for (int &t:temp){ 
            int x=nums1[t];
            int y=nums2[t];
            while (minHeap.size()>k-1){ //保持小顶堆(子序列)的长度不大于k
                sum-=minHeap.top();  
                minHeap.pop();
            }
            minHeap.push(x);
            sum+=x;
            if (minHeap.size()==k){   //保证小顶堆(子序列)的长度等于k
                res=max(res,sum*y);  
            }
        }
        return res;
    }
};

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

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

相关文章

74 QML ProgressBar显示进度数字

1 引言 由于目前使用的是qt.5.14版本&#xff0c;Qt Quick Controls 已经从1.0版本 变为2.0版本了&#xff0c;如果继续使用的Qt Quick Controls 1 的style:方式&#xff0c;改变进度条的样式已经不行了&#xff0c;其会报错&#xff1a;Invalid property name "style&quo…

Langchain的一些问题和替代选择

Langchain因其简化大型语言模型(llm)的交互方面的到关注。凭借其高级的API可以简化将llm集成到各种应用程序中的过程。 但是Langchain乍一看似乎是一个方便的工具&#xff0c;但是它有时候否更像是一个语言迷宫&#xff0c;而不是一个直截了当的解决方案。在本文中&#xff0c…

mysql 增量备份与恢复使用详解

目录 一、前言 二、数据备份策略 2.1 全备 2.2 增量备份 2.3 差异备份 三、mysql 增量备份概述 3.1 增量备份实现原理 3.1.1 基于日志的增量备份 3.1.2 基于时间戳的增量备份 3.2 增量备份常用实现方式 3.2.1 基于mysqldump增量备份 3.2.2 基于第三方备份工具进行增…

安装 Gin 框架

首先需要在目录下初始化一下 go 项目 go init可以看到生成了一个go.mod文件&#xff0c;然后使用以下命令安装 gin 框架 go get -u github.com/gin-gonic/gin养成一个好习惯&#xff0c;在写项目之前先初始化项目 go mod init go mod tidy如果不初始化项目的话没有第三方库补…

Tampermonkey实践:安装引导及开发一个网页背景色更改插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

基于SpringBoot的火车订票管理系统

基于SpringBootVue的火车订票管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、会员 会员&…

java_日期时间API

文章目录 一、JDK8之前的日期时间API1.1 System类的currentTimeMillis()1.2 两个Date类1.2.1 java.util.Date包下的1.2.2 java.sql.Date包下的 一、JDK8之前的日期时间API 1.1 System类的currentTimeMillis() 获取当前时间对应的毫秒数&#xff0c;long类型 当前时间与1970年1…

vscode各种配置的方法

一. vscode配置 vscode 是微软公司提供的一个 代码编辑器。是做C/C常用的编辑器。 在安装后&#xff0c;可以根据自己需要自行安装常用的配置插件。同时&#xff0c;也可以在设置栏设置自己需要的功能&#xff0c;以方便使用。 下面学习 vscode的几种常见的设置。 二. vsco…

vue中 字体图标引入 - iconfont阿里字体图标库

官网&#xff1a;iconfont-阿里巴巴矢量图标库 代码应用中&#xff0c;有许多方法&#xff0c;如何使用该图标库。如&#xff0c;icon单个使用、unicode引用、或 font-class引用&#xff08;推&#xff09;、symbol&#xff08;svg合集&#xff09;。本文主讲 font-class 方法…

C#,《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码

1 随机数的问题 用 C# Random 类生成的随机数是平均分布的。也就是各数据段的出现的次数差不多。彩票号码属于这种随机数。 而很多很多常见的随机数&#xff0c;比如&#xff1a;成绩&#xff0c;却是符合正态分布的。 因而很多时候需要生成符合正态分布规律的随机数。 2 文…

JavaFx之Hello, World!

当使用 JavaFX 进行应用程序开发时&#xff0c;Application 类是一个关键组件。它是 JavaFX 应用程序的入口点&#xff0c;负责启动应用程序并设置应用程序的主舞台&#xff08;Stage&#xff09;和场景&#xff08;Scene&#xff09;。下面是一个详细介绍 Application 类并带有…

MySQL——锁

简介 多线程访问共享资源的时候&#xff0c;避免不了资源竞争而导致数据错乱的问题&#xff0c;所以我们通常为了解决这一问题&#xff0c;都会在访问共享资源之前加锁。 锁的分类 Mysql中的锁机制基本上都是采用的悲观锁来实现的。 行锁 行锁就是一锁锁一行或者多行记录&a…

【Spatial-Temporal Action Localization(一)】认识时空动作定位

文章目录 任务定义任务难点数据集任务现状评估指标可以思考的创新的角度 不错的博客&#xff0c;还有框架推荐 南京大学开源MultiSports&#xff1a;面向体育运动场景的细粒度多人时空动作检测数据集… 论文阅读推荐、Video Understanding&#xff08;3&#xff09;Spatio-Te…

d3dcompiler_47.dll缺失怎么修复,这个方法电脑小白也能学会

在计算机领域&#xff0c;d3dcompiler_47.dll文件是DirectX的一部分&#xff0c;用于执行硬件加速的图形渲染。当遇到“找不到d3dcompiler_47.dll丢失”的问题时&#xff0c;通常表示系统缺少此文件或其路径设置不正确。本文将介绍一些详细解决方法&#xff0c;帮助您解决这个问…

外观数列问题

给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1" countAndSay(n…

Docker的架构描述与安装部署

概述 Docker是一个开放的容器化平台&#xff0c;其提供能力轻松地支撑业务应用的开发、打包、装载、分发以及运行&#xff0c;在DevOps领域中&#xff0c;docker能高效地应对业务应用的持续集成以及持续发布&#xff08;CI/CD&#xff09;&#xff0c;其架构如下所示&#xff…

2023金九银十必看前端面试题!2w字精品!

文章目录 导文CSS1. 请解释CSS的盒模型是什么&#xff0c;并描述其组成部分。2. 解释CSS中的选择器及其优先级。3. 解释CSS中的浮动&#xff08;float&#xff09;是如何工作的&#xff0c;并提供一个示例。4. 解释CSS中的定位&#xff08;position&#xff09;属性及其不同的取…

机器人制作开源方案 | 桌面级机械臂--应用设计

本节内容将基于机器视觉带着大家进行应用实训。机器视觉是人工智能正在快速发展的一个分支&#xff0c;简单说来机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品&#xff08;即图像摄取装置&#xff0c;分CMOS和CCD两种&#xff09;将被摄取目标转换…

Spring声明式事务

编程式事务 Spring-tx 声明式事务可以理解为对编程式事务的一个封装 spring-tx 使用多态的形式,满足不同类型的事务需求 【尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?p60&vd_source7…

【算法与数据结构】98、LeetCode验证二叉搜索树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;注意不要落入下面你的陷阱&#xff0c;笔者本来想左节点键值<中间节点键值<右节点键值即可&…