2 matrices con la misma longitud, seleccione k subíndices de ellas (las dos matrices usan el mismo subíndice), y obtendrá
k números en nums1 y k números en nums2.
puntuación = suma de k nums1 números ✖ min(k nums2 números),
encuentre la puntuación más alta.
Ideas:
Igual que la pregunta 1383.
Cada vez se multiplica por el menor de k números nums2. Entonces definitivamente quiero encontrar el nums2 más grande cada vez.Es
mejor dar prioridad a los nums2 más grandes.
Luego forme un par de nums1[i] y nums2[i] como elementos para formar una matriz, ordenada por nums2.
De esta manera, se prefiere el nums2 más grande al atravesar la matriz.
Después de descender nums2, es equivalente a reducir el problema a una dimensión, ahora queda tomar un nums1 más grande para asegurar que la suma (k nums1) sea mayor.
Después de que el número de nums1 > k, elimine el más pequeño, actualice la suma y actualice la puntuación cuando el número = k.
public long maxScore(int[] nums1, int[] nums2, int k) {
int n = nums1.length;
int[][] nums12 = new int[n][2];
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
long sum = 0;
long res = 0;
for(int i = 0; i < n; i++) {
nums12[i] = new int[]{
nums1[i], nums2[i]};
}
Arrays.sort(nums12, (a, b)->(b[1]-a[1]));
for(int[] num : nums12) {
sum += num[0];
minHeap.offer(num[0]);
if(minHeap.size() > k) sum -= minHeap.poll();
if(minHeap.size() == k) res = Math.max(res, sum*num[1]);
}
return res;
}
También se puede optimizar. El método anterior es poner cada nums1 en minHeap, y luego considerar eliminarlo.
Ahora considere cargar k números primero.
Si nums1 es más pequeño que el elemento más pequeño en minHeap, no necesita ponerlo en de nuevo. Ahórrate un paso.
public long maxScore(int[] nums1, int[] nums2, int k) {
int n = nums1.length;
int[][] nums12 = new int[n][2];
for(int i =0; i<n; i++){
nums12[i] = new int[]{
nums1[i], nums2[i]};
}
Arrays.sort(nums12, (a,b)->(b[1]-a[1]));
long res = -1;
PriorityQueue<Integer> pq = new PriorityQueue<>(k);
long sum =0;
for(int i = 0; i < k; i++){
pq.add(nums12[i][0]);
sum += nums12[i][0];
}
res= Math.max(res, (sum * nums12[k-1][1]));
for(int i = k; i < n; i++){
int n1 = nums12[i][0];
if(n1 > pq.peek()){
sum -= pq.poll();
pq.add(n1);
sum += n1;
}
res= Math.max(res, (sum * nums12[i][1]));
}
return res;
}