博主介绍:?目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。
博主所有博客文件目录索引:博客目录索引(持续更新)
视频平台:b站-Coder长路
来源:《LeetCode 75》
题目链接:2542. 最大子序列的分数
类型:数据结构/树/小顶堆
思路:排序+小顶堆
复杂度分析:时间复杂度O(n.logn);空间复杂度O(n)
class Solution {
public long maxScore(int[] nums1, int[] nums2, int k) {
int n = nums1.length;
//维护k个元素的小顶堆
PriorityQueue<Integer> queue = new PriorityQueue<>(k);
//创建nums2数组的索引数组,并且根据nums2数组中的值降序排列的索引数组
Integer[] sorteds = new Integer[n];
for (int i = 0; i < n; i ++) {
sorteds[i] = i;
}
//根据nums2的值进行降序排列
Arrays.sort(sorteds, (i, j)->nums2[j]-nums2[i]);
//定义一个k个值组成的sum
long sum = 0L;
//首先合并k-1个元素值
for (int i = 0; i < k - 1; i ++) {
sum += nums1[sorteds[i]];//合并的是基于索引值的nums1数组元素
queue.offer(nums1[sorteds[i]]);
}
long ans = 0L;
//遍历剩余的所有元素,每次构成一个新的组合
for (int i = k - 1; i < n; i ++) {
//将当前值累加,并将当前值添加到
sum += nums1[sorteds[i]];
queue.offer(nums1[sorteds[i]]);
//sum即为k个元素之和 nums2[sorteds[i]]则为k个中最小的值
ans = Math.max(ans, sum * nums2[sorteds[i]]);
//出小顶堆中最小的元素
sum -= queue.poll();
}
return ans;
}
}
大家点赞、收藏、关注、评论啦~
精彩专栏推荐订阅:在下方专栏👇🏻
更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅
整理者:长路 整理时间:2024.1.17