1+ import java .util .ArrayList ;
2+ import java .util .List ;
3+ import java .util .PriorityQueue ;
4+
5+ public class Solution2542 {
6+ public long maxScore (int [] nums1 , int [] nums2 , int k ) {
7+ int n = nums1 .length ;
8+ List <Node > list = new ArrayList <>();
9+ for (int i = 0 ; i < n ; i ++) {
10+ list .add (new Node (i , nums1 [i ], nums2 [i ]));
11+ }
12+ // 大到小排序,枚举 min(nums2[i]) 范围 [k-1, n-1]
13+ list .sort ((o1 , o2 ) -> Integer .compare (o2 .n2 , o1 .n2 ));
14+
15+ // 大小为 k 的最小堆
16+ PriorityQueue <Integer > minHeap = new PriorityQueue <>();
17+ long sum = 0 ;
18+ // [0, k-1]
19+ for (int i = 0 ; i < k ; i ++) {
20+ int n1 = list .get (i ).n1 ;
21+ minHeap .add (n1 );
22+ sum += n1 ;
23+ }
24+ long min = list .get (k - 1 ).n2 ;
25+ long res = sum * min ;
26+
27+ // [k, n-1]
28+ for (int i = k ; i < n ; i ++) {
29+ int n1 = list .get (i ).n1 ;
30+ min = list .get (i ).n2 ;
31+
32+ int top = minHeap .element ();
33+ if (n1 > top ) {
34+ minHeap .add (n1 );
35+ sum -= minHeap .remove ();
36+ sum += n1 ;
37+ }
38+ res = Math .max (res , sum * min );
39+
40+ }
41+ return res ;
42+ }
43+
44+ private static class Node {
45+ int id ;
46+ int n1 ;
47+ int n2 ;
48+
49+ public Node (int id , int n1 , int n2 ) {
50+ this .id = id ;
51+ this .n1 = n1 ;
52+ this .n2 = n2 ;
53+ }
54+ }
55+ }
56+ /*
57+ 2542. 最大子序列的分数
58+ https://leetcode.cn/problems/maximum-subsequence-score/
59+
60+ 第 96 场双周赛 T3。
61+
62+ 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,两者长度都是 n ,再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。
63+ 对于选择的下标 i0 ,i1 ,..., ik - 1 ,你的 分数 定义如下:
64+ - nums1 中下标对应元素求和,乘以 nums2 中下标对应元素的 最小值 。
65+ - 用公示表示: (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] , nums2[i1], ... ,nums2[ik - 1]) 。
66+ 请你返回 最大 可能的分数。
67+ 一个数组的 子序列 下标是集合 {0, 1, ..., n-1} 中删除若干元素得到的剩余集合,也可以不删除任何元素。
68+ 提示:
69+ n == nums1.length == nums2.length
70+ 1 <= n <= 10^5
71+ 0 <= nums1[i], nums2[j] <= 10^5
72+ 1 <= k <= n
73+
74+ 将 nums1 和 nums2 组合起来后按 nums2 由大至小排序。枚举 nums2[i] 取值范围为 [k-1, n-1]
75+ 同时用最小堆维护 k 个 nums1 最大值。
76+ 时间复杂度 O(nlogn)
77+ 空间复杂度 O(n)
78+ 相似题目: 703. 数据流中的第 K 大元素
79+ https://leetcode.cn/problems/kth-largest-element-in-a-stream/
80+ */
0 commit comments