título
Encontrar un número de serie duplicados.
Todos los números en una matriz de nums longitud n de están en el rango de 0 ~ n-1. Algunos de matriz digital se duplica, pero no sabe cuántos números repetir, no sé cada número se repitió varias veces. Por favor, encontrar una gran variedad de cualquiera de los números duplicados.
Ejemplo 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
restricciones:2 <= n <= 100000
Un pensamiento: tabla hash
Inicialización del tamaño de la tabla hash es el tamaño de los elementos de la matriz, el valor inicial de -1 (porque todos los elementos de la matriz es mayor que 0).
Cada número n a través de la matriz, si el valor de hash de 0 indica que el número ya existe, regresa directamente, de lo contrario, actualizar el número n correspondiente al valor de hash de 0 indica una posición ya existe.
código
complejidad Tiempo: O (n)
la complejidad espacial: O (n)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
vector<int> hash(nums.size(), -1);
for (auto n : nums) {
if (hash[n] == 0) return n;
++hash[n];
}
return -1;
}
};
Pensar dos: Ordenar Encuentra
Después de haberlo pedido, si hay números iguales de dos de retorno adyacente.
código
complejidad del tiempo: O (nlogn)
Complejidad espacial: O (1)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == nums[i - 1]) return nums[i];
}
return -1;
}
};
Pensamiento tres: Posición de Cambio
Subíndice i es la posición de cada matriz, se determina si o igual a la nums [i]
- Si el índice i no es igual nums posición [i], nums entonces los nums [i] deberían realmente ser colocados [nums [] i] posición
- Si nums [i] iguales nums [nums [i]], los elementos que se repiten encontraron;
- De lo contrario, los nums de cambio [i] y [nums nums [i]], pronto nums [i] en la posición correcta.
- Si son iguales, se determina que una posición.
código
complejidad Tiempo: O (n)
la complejidad del espacio: O (1)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
while (nums[i] != i) {
if (nums[nums[i]] == nums[i]) return nums[i];
swap(nums[i], nums[nums[i]]);
}
}
return -1;
}
};