最大子序列的分数

ops/2024/9/24 6:26:34/

题目链接

最大子序列的分数

题目描述


注意点

  • 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的堆顶

代码

java">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子序列中的最小值也更小),不考虑

http://www.ppmy.cn/ops/39511.html

相关文章

局域网语音对讲系统_IP广播对讲系统停车场解决方案

局域网语音对讲系统_IP广播对讲系统停车场解决方案 需求分析&#xff1a; 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要…

类和对象-Python-第一部分

初识对象 使用对象组织数据 class Student:nameNonegenderNonenationalityNonenative_placeNoneageNonestu_1Student()stu_1.name"林军杰" stu_1.gender"男" stu_1.nationality"中国" stu_1.native_place"山东" stu_1.age31print(stu…

Java缓存caffeine使用心得

文章目录 添加依赖一、手动加载1&#xff0c;定义缓存2&#xff0c;写入缓存&#xff08;增、改&#xff09;3&#xff0c;获取大小4&#xff0c;模拟耗时操作5&#xff0c;移除缓存元素6&#xff0c;查询缓存&#xff08;查&#xff09;7&#xff0c;统计缓存 二、同步加载1&a…

CSS 定位

为什么需要浮动? 我们在访问一些网站的时候, 经常会遇到如下这种情况, 有一个组件, 一直固定在屏幕的固定位置, 无论你如何滑动这个网页, 就会固定在哪里, 如下, 下图是王者荣耀的一个官网: 要实现上面的效果, 标准流或者是浮动是无法快速实现的, 此时就需要使用定位来实现.…

三大消息传递机制区别与联系

目录 总结放开头 1、定义区别&#xff1a; EventBus Broadcast Receiver Notification 2、使用区别: EventBus Broadcast Receiver Notification 3、补充通知渠道&#xff1a; 通知渠道重要程度 总结放开头 BroadCast Receiver:属于安卓全局监听机制&#xff0c;接收…

AI“源神”启动!Llama 3发布,开闭源之争战局生变

在AI的世界里&#xff0c;开源与闭源的较量一直是科技界的热门话题。 今年年初&#xff0c;埃隆马斯克在对OpenAI及其CEO萨姆奥特曼提起诉讼时&#xff0c;就对OpenAI逐渐不公开其模型研究相关细节的行为大加谴责。“时至今日&#xff0c;OpenAI公司网站还宣称&#xff0c;它的…

MongoDB聚合运算符:$toHashedIndexKey

MongoDB聚合运算符&#xff1a;$toHashedIndexKey 文章目录 MongoDB聚合运算符&#xff1a;$toHashedIndexKey语法举例角度的双曲正切 $toHashedIndexKey计算并返回输入表达式的哈希值&#xff0c;其使用的哈希函数与MongoDB创建哈希索引相同。哈希函数将键值或字符串映射到固定…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取&#xff0c;克隆项目到本地创建分支切换分支将…