Calcule la suma mínima de la matriz

tema

La definición de la suma pequeña de la matriz es la siguiente:
Por ejemplo, en la matriz s = [1, 3, 5, 2, 4, 6],
la suma de los números menores o iguales as [0] a la izquierda de s [0] es 0;
en s [ La suma de los números menores o iguales as [1] en el lado izquierdo de 1] es 1; la suma de los números
menores o iguales que s [2] en el lado izquierdo de s [2] es 1 + 3 = 4;
en el lado izquierdo de s [3] La suma de los números menores o iguales as [3] es 1;
la suma de los números menores o iguales as [4] en el lado izquierdo de s [4] es 1 + 3 + 2 = 6;
en el lado izquierdo de s [5] es menor que o La suma de los números iguales as [5] es 1 + 3 + 5 + 2 + 4 = 15.
Entonces, la pequeña suma de s es 0 + 1 + 4 + 1 + 6 + 15 = 27.
Dada una matriz s, la función de realización devuelve la pequeña suma de s
[Requerido] La complejidad del tiempo es O (nlogn) y la complejidad del espacio es O ( n)
enlace al tema

Ideas

La realización de la fusión no es difícil, lo difícil es por qué se puede realizar mediante la fusión. Esto requiere pensar en una dirección diferente.

Para cada número, lo que necesitamos es la suma de todos los números de su lado izquierdo que sean menores o iguales a él. Calcula la suma de todos los números. Luego suma para obtener el resultado.
Si solo miramos el resultado, podemos encontrar que si s[i]el número de la derecha es mayor que él n个, entonces la contribución de este número en el resultado final es n * s[i].


Por ejemplo, el ejemplo de la descripción del título. La
suma de los números menores o iguales as [1] en el lado izquierdo de s [1] es 1;
la suma de números menores o iguales que s [2] en el lado izquierdo de s [2] es 1 + 3 = 4 ;
en s a la izquierda [3] es menor o igual que s [3] del número de y es 1;
a la izquierda de s [. 4] es menor o igual que s [. 4] el número es 1 + 3 + 2 = 6;
en La suma de los números del lado izquierdo de s [5] es menor o igual que s [5] es 1 + 3 + 5 + 2 + 4 = 15.


puede ser vistoHay cinco números en el lado derecho de s [0] mayores o iguales que él., Por lo que s[0]se agregó cinco veces,Hay tres números en el lado derecho de s [1] mayores o iguales que, Por lo que s[1]se agregó tres veces. Es lo mismo detrás. Por lo tanto, puede encontrar s[i]cuántos derechos son mayores o iguales cada vez en el proceso de fusión .

import java.util.*;

/**
 * @author 香榭的落叶
 */
public class Main {
    
    
  public static void main(String[] args) {
    
    
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] arr = new int[n], temp = new int[n];
    for (int i = 0; i < arr.length; i++) {
    
    
      arr[i] = sc.nextInt();
    }
    System.out.println(mergeSort(arr, 0, n - 1, temp));
  }

  static long mergeSort(int[] arr, int l, int r, int[] temp) {
    
    
    if (l == r) return 0;
    int mid = l + (r - l) / 2;
    return mergeSort(arr, l, mid, temp) 
        + mergeSort(arr, mid + 1, r, temp) 
        + merge(arr, l, mid, r, temp);
  }

  static long merge(int[] arr, int l, int mid, int r, int[] temp) {
    
    
    int i = l, j = mid + 1;
    long ret = 0;
    int idx = l;
    while (i <= mid && j <= r) {
    
    
      //之前在这有一个疑问,归并的时候[l, mid],[mid + 1, r]肯定是有序的
      //为什么计算结果的时候不加上[i + 1, mid]这一段
      ret += arr[i] <= arr[j] ? (r - j + 1) * arr[i] : 0;
      temp[idx++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
    }
    while (i <= mid) temp[idx++] = arr[i++];
    while (j <= r) temp[idx++] = arr[j++];
    //参数含义:src, srcPos, dest, destPos, len
    System.arraycopy(temp, l, arr, l, r - l + 1);
    return ret;
  }
}

Después de pensarlo detenidamente, el párrafo anterior ya se calculó durante el subproceso recursivo.
Como matrices arr = [1, 3, 5, 2, 4]. Su proceso de niño cuando la recursividad de la siguiente manera:
[1, 3, 5], [2, 4]
[1, 3] [5], [2], [4]
[1],[3] [5]
en [1],[3]el proceso de cálculo de la fusión ha sido demasiado pequeño y 3, el [1, 3] 与 [5]tiempo de mezcla más 3 no necesita. Es decir, cada vez que se fusionan, los dos segmentos más grandes se fusionan y, en este momento, [i + 1, mid]este segmento se ha acumulado en la ronda anterior de fusión.

Supongo que te gusta

Origin blog.csdn.net/qq_42007742/article/details/109293886
Recomendado
Clasificación