【Semana doble】 No.24

C_01 Suma gradualmente para obtener el valor mínimo de número positivo

Te da una gran variedad de números enteros. Puede elegir cualquier valor de inicio positivo como valor inicial.

Debe atravesar la matriz de números de izquierda a derecha y acumular los valores en la matriz de números a su vez.

Asegúrese de que la suma acumulativa sea siempre mayor o igual a 1 y elija un número positivo más pequeño como valor inicial.

输入:nums = [-3,2,-3,4,2]
输出:5
解释:如果你选择 startValue = 4,在第三次累加时,和小于 1 。
                累加求和
                startValue = 4 | startValue = 5 | nums
                  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3
                  (1 +2 ) = 3  | (2 +2 ) = 4    |   2
                  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3
                  (0 +4 ) = 4  | (1 +4 ) = 5    |   4
                  (4 +2 ) = 6  | (5 +2 ) = 7    |   2

Método 1: enumeración

public int minStartValue(int[] nums) {
    int st = Integer.MAX_VALUE;
    int t = -1;

    for (int i = 1; i < Integer.MAX_VALUE; i++) {
        st = i;
        int sum = st;
        boolean flag = true;
        for (int j = 0; j < nums.length; j++) {
            sum += nums[j];
            if (sum < 1) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return st;
        }
    }
    return st;
}

Análisis de complejidad.

  • Complejidad del tiempo: El ( . . . ) El (...) ,
  • Complejidad espacial: O ( 1 ) O (1)

Método 2: Prefijo y

  • Piénselo de esta manera: porque el objetivo es hacer que el prefijo más pequeño y el valor que aparecen en el proceso de acumulación sea mayor que 1,
  • Por lo tanto, necesitamos registrar el valor mínimo del resultado obtenido después de cada acumulación.
  • Finalmente, la fórmula x-min> = 1 da: x = 1-min
public int minStartValue(int[] nums) {
    int prefix = 0, min = 0;
    for (int n : nums) {
        prefix += n;
        min = Math.min(min, prefix);
    }
    return 1 - min;
}

Análisis de complejidad.

  • Complejidad del tiempo: O ( n ) O (n)
  • Complejidad espacial: O ( 1 ) O (1)

El número mínimo de números de Fibonacci con B_02 y K

Proporcione el número k, devuelva el número mínimo de números de Fibonacci que son suma k, donde cada número de Fibonacci se puede usar varias veces.

Los números de Fibonacci se definen como:

  • F1 = 1
    F2 = 1
    Fn = Fn-1 + Fn-2, donde n> 2.

Los datos garantizan que para un determinado k, se debe encontrar una solución factible.

Consejo: 1 <= k <= 10 ^ 9

输入:k = 7
输出:2 
解释:斐波那契数字为:1,1,2,3,5,8,13,……
对于 k = 7 ,我们可以得到 2 + 5 = 7 。

输入:k = 19
输出:3 
解释:对于 k = 19 ,我们可以得到 1 + 5 + 13 = 19 。

Método 1: codicia

Se usa el menor número requerido, lo que significa que solo podemos usar primero un número relativamente grande cercano a k. Mi enfoque es preprocesar el fab primero, y luego enumerar de atrás hacia adelante, tratar de usar números grandes.

public int findMinFibonacciNumbers(int k) {
    List<Integer> fab = new ArrayList<>();
    fab.add(1);
    fab.add(1);
    while (fab.get(fab.size()-1) < k) {
        int t = fab.get(fab.size()-1) + fab.get(fab.size()-2); 
        fab.add(t);
    }
    int cnt = 0;
    for (int i = fab.size()-1; i >= 0; i--) {
        while (k >= fab.get(i)) {
            k -= fab.get(i);
            cnt++;
        } 
    }
    return cnt;
}

Análisis de complejidad.

  • Complejidad del tiempo: O ( n ) O (n)
  • Complejidad espacial: O ( n ) O (n)

B_03 La cadena con el orden k más pequeño de lexicografía en la cadena feliz de longitud n

Una "cadena feliz" se define como:

  • Contiene solo letras minúsculas ['a', 'b', 'c'].
  • Para todo i entre 1 y s.length-1, satisfaga s [i]! = S [i + 1] (el subíndice de la cadena comienza desde 1).

Por ejemplo, las cadenas "abc", "ac", "b" y "abcbabcbcb" son cadenas felices, pero "aa", "baa" y "ababbc" no son cadenas felices.

Para darle dos enteros n y k, debe ordenar todas las cadenas felices de longitud n lexicográficamente.

Devuelva la kth cadena feliz después de ordenar. Si hay menos de k cadenas felices con longitud n, devuelva la cadena vacía

Consejos:

  • 1 <= n <= 10
    1 <= k <= 100
输入:n = 3, k = 9
输出:"cab"
解释:长度为 3 的开心字符串总共有 12 个
 ["aba", "abc", "aca", "acb", "bab", "bac", 
 "bca", "bcb", "cab", "cac", "cba", "cbc"] 。
 第 9 个字符串为 "cab"

Método 1: retroceso

https://blog.csdn.net/qq_43539599/article/details/105610372


A_04 Restaurar matriz

Un programa originalmente debería generar una matriz de enteros. Pero este programa se olvidó de generar espacios y generar una cadena de números. La única información que conocemos es: todos los enteros en la matriz están entre [1, k], y los números en la matriz no tienen 0 a la izquierda.

Te da la cadena sy el entero k. Puede haber muchos resultados de recuperación de matriz diferentes.

De acuerdo con el procedimiento anterior, devuelva el número de todos los esquemas de matriz posibles de la cadena de salida s.

Como el número de esquemas de matriz puede ser grande, devuelva el resultado después de tomar el resto de 10 ^ 9 + 7.

输入:s = "1317", k = 2000
输出:8
解释:可行的数组方案为 [1317],[131,7],[13,17],[1,317],[13,1,7],[1,31,7],[1,3,17],[1,3,1,7]
输
入:s = "2020", k = 30
输出:1
解释:唯一可能的数组方案是 [20,20] 。 [2020] 不是可行的数组方案,原因是 2020 > 30 。
 [2,020] 也不是可行的数组方案,因为 020 含有前导 0 。

Método 1: ninguno

Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105607829
Recomendado
Clasificación