leetcode 2542. Puntuación máxima de subsecuencia (puntuación máxima de subcadena)

inserte la descripción de la imagen aquí

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; 
}

Supongo que te gusta

Origin blog.csdn.net/level_code/article/details/130842272
Recomendado
Clasificación