La espada se refiere a la oferta (1): encuentra los números repetidos en la matriz

❝
涓滴之水终可以磨损大石,不是由于它力量强大,而是由于昼夜不舍的滴坠。——贝多芬

❞

Encuentra números repetidos en la matriz


Descripción del Título

Todos los números en una matriz de longitud n están en el rango de 0 a n-1. Algunos números de la matriz se repiten, pero no sé cuántos números se repiten ni cuántas veces se repite cada número. Busque cualquier número duplicado en la matriz. Por ejemplo, si la longitud de entrada es 7 matriz {2, 3, 1, 0, 2, 5, 3}, entonces la salida correspondiente es el número repetido 2 o 3.

solución

Solución 1: Después de
ordenar, escanee secuencialmente para determinar si hay una repetición. La complejidad de tiempo es O (n²).

Solución 2:
Utilice una tabla hash para recorrer la matriz. Si no existe tal elemento en la tabla hash, guárdelo en la tabla hash, de lo contrario, devuelva un elemento duplicado. La complejidad del tiempo es O (n) y la complejidad del espacio es O (n).

Solución 3 La
longitud es n, y el rango de valores de los elementos también es N. Si no hay elementos repetidos, entonces el valor correspondiente a cada subíndice de la matriz es igual al subíndice.

Recorra la matriz de principio a fin, al escanear a los números numéricos [i] del subíndice i:

  • Si es igual a i, continúe explorando hacia abajo;
  • Si no es igual a i, compáralo con nums [i] -ésimo número, si es igual, significa que hay un valor duplicado y devuelve nums [i]. Si no son iguales, intercambie el i-ésimo número con nums [i] -ésimo número. Repita este proceso de intercambio comparativo.
    La complejidad temporal de este algoritmo es O (n), porque cada elemento solo necesita intercambiarse dos veces como máximo para determinar la posición. La complejidad del espacio es O (1).
/**
 * @author bingo
 * @since 2018/10/27
 */

public class Solution {
    /**
     * 查找数组中的重复元素
     * @param numbers 数组
     * @param length 数组长度
     * @param duplication duplication[0]存储重复元素
     * @return boolean
     */
    public boolean duplicate(int[] numbers, int length, int[] duplication) {
        if (numbers == null || length < 1) {
            return false;
        }
        for (int e : numbers) {
            if (e >= length) {
                return false;
            }
        }

        for (int i = 0; i < length; ++i) {
            while (numbers[i] != i) {
                if (numbers[i] == numbers[numbers[i]]) {
                    duplication[0] = numbers[i];
                    return true;
                }
                swap(numbers, i, numbers[i]);
            }
        }

        return false;
    }

    private void swap(int[] numbers, int i, int j) {
        int t = numbers[i];
        numbers[i] = numbers[j];
        numbers[j] = t;
    }
}

Caso de prueba

  1. Una matriz de longitud n contiene uno o más números repetidos;
  2. La matriz no contiene números repetidos;
  3. Caso de entrada de prueba no válido (introduzca un puntero nulo; la matriz de longitud n contiene números distintos de 0 ~ n-).

Organice todas las soluciones de problemas que escribí en un libro electrónico y lo coloqué en github, ¡y llegué a la cima de la clasificación de github en tres días! ¡Casi 5w personas descargaron y leyeron! Si quieres conseguirlo, ve al enlace de abajo (recuerda darme una estrella):

https://github.com/geekxh/hello-algorithm

La espada se refiere a la oferta (1): encuentra los números repetidos en la matriz

Supongo que te gusta

Origin blog.51cto.com/15076236/2609662
Recomendado
Clasificación