Primeros pasos con el algoritmo LeetCode - Matriz ordenada de entrada

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento .

Suma de dos números II - Matriz ordenada de entrada

dirección del título original

Dada una matriz de enteros  con subíndices a partir de 1numbers , la matriz se ha organizado en orden no decreciente  , busque dos números de la matriz que satisfagan la suma y la suma sea igual al  targetnúmero objetivo. Si estos dos números son respectivamente numbers[index1] y numbers[index2], entonces 1 <= index1 < index2 <= numbers.length.

Devuelve la suma de los subíndices de estos dos enteros como una matriz de de longitud 2 .[index1, index2]index1index2

Puede suponer que cada corresponde a una respuesta única y no puede reutilizar los mismos elementos.

La solución que diseñe debe usar solo espacio adicional de nivel constante. Ejemplo 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:27 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
复制代码

Ejemplo 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:24 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
复制代码

Ejemplo 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-10 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
复制代码

análisis de pensamiento

método uno

Bucle de doble capa simple y grosero, juzgue la condición y luego regrese al subíndice.

Método dos

  1. Debido a que la matriz está ordenada, se puede usar la búsqueda binaria.
  2. Para encontrar la suma de dos números iguales al valor objetivo, primero puede fijar un número, luego encontrar otro número y el otro número es igual al valor objetivo menos el primer número.
  3. El límite izquierdo, el límite derecho y la mediana todavía están definidos y se puede obtener el movimiento circular.

código de CA

método uno

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    const len = numbers.length
    for(let i = 0; i < len; i++) {
        for(let j = i + 1; j < len; j++) {
            if(numbers[i] + numbers[j] === target) {
                return [i + 1, j + 1]
            }
        }
    }
};
复制代码

resultado:

  • Resultado de la ejecución: aprobado
  • Tiempo de ejecución: 548 ms, superando al 5,06 % de los usuarios en todas las confirmaciones de JavaScript
  • Consumo de memoria: 42 MB, supera al 44,43 % de los usuarios en todos los envíos de JavaScript
  • Casos de prueba superados: 21/21

Método dos

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    for (let i = 0; i < numbers.length; i++) {
        let low = i + 1
        let high = numbers.length - 1
        while (low <= high) {
            let mid = Math.floor((high - low) / 2) + low;
            if (numbers[mid] === target - numbers[i]) {
                return [i + 1, mid + 1];
            } else if (numbers[mid] > target - numbers[i]) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
    }
};
复制代码

resultado:

  • Resultado de la ejecución: aprobado
  • Tiempo de ejecución: 64 ms, superando al 81,18 % de los usuarios en todos los envíos de JavaScript
  • Consumo de memoria: 42,3 MB, supera al 17,11 % de los usuarios en todos los envíos de JavaScript
  • Casos de prueba superados: 21/21

FINAL

Supongo que te gusta

Origin juejin.im/post/7079030274012479519
Recomendado
Clasificación