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
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 target
nú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]
index1
index2
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]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
复制代码
Ejemplo 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
复制代码
Ejemplo 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -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
- Debido a que la matriz está ordenada, se puede usar la búsqueda binaria.
- 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.
- 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