最大子序列的分数

题目链接

最大子序列的分数

题目描述


注意点

  • n == nums1.length == nums2.length
  • 从nums1和nums2中选一个长度为k的子序列对应的下标
  • 对nums1中下标对应元素求和,乘以nums2中下标对应元素的最小值得到子序列的分数
  • 0 <= nums1[i], nums2[j] <= 100000
  • 1 <= k <= n

解答思路

  • 初始想到的是深度优先遍历,传递nums1子序列的和以及nums2中值最小的元素,当选择了k个元素时,计算分数,统计分数的最大值,但是超时
  • 参照题解,可以先将nums2从大到小进行排序,因为子序列中nums1和nums2的下标都是相同的,所以需要记录对nums2中的值进行排序后记录的是新下标newIdx
  • 使用PriorityQueue存储子序列中nums1的元素,堆顶对应的是元素的最小值。在更换子序列的元素时,按照排好序的nums2将后续的元素newIdx加入进来,同时将之前子序列中某个元素弹出(不论弹出哪个元素nums2的最小值都是nums2[newIdx]),弹出的元素应该是子序列中nums1的最小值,也就是PriorityQueue的堆顶

代码

class Solution {
    public long maxScore(int[] nums1, int[] nums2, int k) {
        int n = nums1.length;
        Integer[] idxArr = new Integer[n];
        for (int i = 0; i < n; i++) {
            idxArr[i] = i;
        }
        // nums2从大到小进行排序,仅记录下标位置
        Arrays.sort(idxArr, (x, y) -> (nums2[y] - nums2[x]));
        // 堆顶为最小值
        PriorityQueue<Integer> queue = new PriorityQueue<>((x, y) -> (x - y));
        long sum1 = 0;
        for (int i = 0; i < k; i++) {
            int idx = idxArr[i];
            sum1 += nums1[idx];
            queue.offer(nums1[idx]);
        }
        long res = sum1 * nums2[idxArr[k - 1]];
        for (int i = k; i < n; i++) {
            // 此时nums2[idx]是nums2中子序列的最小值
            // 满足上述条件且nums1中相应子序列和最大:加上idx处的元素值,减去前面子序列中的最小元素
            int idx = idxArr[i];
            // nums2[idx]也比之前的子序列小,sum1也比之前的子序列小,分数一定更小,不考虑
            if (nums1[idx] < queue.peek()) {
                continue;
            }
            sum1 -= queue.poll();
            sum1 += nums1[idx];
            queue.offer(nums1[idx]);
            res = Math.max(res, sum1 * nums2[idx]);
        }
        return res;
    }
}

关键点

  • 将nums2中的元素从大到小进行排序,初始选择k个元素,对应nums2最小值就是nums2[k - 1],按顺序加入元素,弹出之前某个元素,保证快速找到子序列中nums2的最小值
  • 根据nums2选择好子序列后,根据其下标将nums1中对应元素添加到PriorityQueue中(堆顶为最小值),保证快速找到nums2[newIdx]是最小值时nums1的元素和最大的子序列
  • 如果加入新的元素下标对应在nums1中的元素值比PriorityQueue堆顶元素更小,说明此时分数一定比上一个子序列分数更低(nums1子序列之和更小,nums2子序列中的最小值也更小),不考虑

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MVCC 详解

介绍 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能&#xff0c;用更好的方式去处理读-写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁。 这里的多版本指的是数据库中同时…

Django项目运行报错:ModuleNotFoundError: No module named ‘MySQLdb‘

解决方法&#xff1a; 在__init__.py文件下&#xff0c;新增下面这段代码 import pymysql pymysql.install_as_MySQLdb() 注意&#xff1a;确保你的 python 有下载 pymysql 库&#xff0c;没有的话可以使用 pip install pymysql安装 原理&#xff1a;用pymysql来代替mysqlL…

Mysql数据库的基础学习

为什么使用数据库&#xff1f; 1.持久化&#xff1a;将数据保存到可掉电式存储设备中以供使用。 数据库相关概念&#xff1a; DB:数据库&#xff08;Databass&#xff09;即存储数据的仓库&#xff0c;本质是一个文件系统&#xff0c;保存了一系列有组织的数据DBMS:数据库管…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

怎么使用远程桌面传输文件?

微软提供的远程桌面功能是一项强大的工具&#xff0c;可让您在同一网络下远程访问和管理其他计算机。除了远程控制&#xff0c;它还支持文件传输功能&#xff0c;为Windows用户提供了极大的便利。在接下来的内容中&#xff0c;我们将介绍如何使用远程桌面传输文件。 如何从远程…

求正方形中一角四边形的面积

求绿色四边形的面积&#xff1f; 假设大正方形的边长为2a 通过中间的点做十字的辅助线&#xff0c;假设两条辅助线的长度为xy,uv 所以 1/2ay1/2au42① 1/2ay1/2av38② 1/2ax1/2av28③ ①③ 1/2ay1/2au1/2ax1/2av4228 &#xff08;1/2ay1/2av&#xff09;1/2au1/2ax4228 代入…

SeetaFace6人脸特征提取与对比C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件&#xff0c;用于共享和编辑地理空间数据。它支持多种地理空间数据格式&#xff0c;并且可以发布为多种服务格式&#xff0c;如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS)&#xff0c;以及…

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

Python装饰器带括号和不带括号的理解

装饰器是 Python 中一个强大且灵活的特性&#xff0c;允许用户在不修改原有函数或类定义的基础上&#xff0c;为其增加额外功能。 今天在尝试自定义 Python 装饰器的时候遇到了一个问题&#xff0c;因为以前一直是使用装饰器&#xff0c;基本没有自定义过装饰器&#xff0c;所…

KEIL declaration may not appear after executable statement in block

KEIL declaration may not appear after executable statement in block 这个问题也是比较经典&#xff0c;就是不允许你的变量定义位置不允许在下边的代码区域&#xff0c;只允许在最上方 ‍ 修改编码模式为C99解决 ‍ ​​

机器学习周报第41周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 背景1.3 论文方法1.3.1 局部特征提取1.3.2 局部特征转换器 (LoFTR) 模块1.3.4 建立粗粒度匹配1.3.5 精细匹配 1.4 损失1.5 实现细节1.6 实验1.6.1 单应性估计1.6.2 相对位姿估计 二、论文代码总结 摘要 本周阅读了一篇特征匹配领域的…

Git团队协作机制

Git 团队协作机制 1.团队内协作 小故事&#xff1a;岳不群手里有华山剑法但是不完整&#xff0c;需要弟子令狐冲进行完善&#xff0c;岳不群将华山剑法推送&#xff08;push&#xff09;到代码托管中心&#xff0c;这样岳不群就有属于自己的远程库&#xff0c;令狐冲从远程库…

思通数科大模型在智能数据查询系统中的深度应用:销售数据分析的革新

在企业决策支持系统中&#xff0c;销售数据分析占据着举足轻重的地位。思通数科的大模型技术&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff0c;为智能数据查询系统提供了强大的分析能力。本文将详细描述思通数科大模型在销售数据分析中的应用&am…

异常检测的学习和实战

1.应用&#xff1a; 1.在工业上的应用 当检测设备是否处于异常工作状态时&#xff0c;可以由上图分析得到&#xff1a;那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的&#xff0c;所以数据点应该比较密集地集中在一个范围内&#xff0c;而那些明…

Excel快速填充序号的方法

Excel快速填充序号常用的方法。 方法一&#xff1a;填充前面序号后拖拽 特点&#xff1a; 能有规律的填充&#xff0c;排序的行数由拖拽的行数决定。 此方法填充的序号等效于手打的序号&#xff0c;删除一行后下一行不会自动更新排序。 步骤&#xff1a;输入两个初始序号&…