Día uno
Dada una matriz de números enteros nums
y un valor objetivo target
, averigua un valor objetivo de los dos enteros en la matriz y regresa a su subíndice de matriz.
Puede asumir que cada entrada solo corresponderá a una respuesta. Sin embargo, el mismo elemento de la matriz no se puede utilizar dos veces .
Ejemplo:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
c ++
Aquí hay una solución de problema de gran elogio, y sus errores se han corregido.
Ley de violencia:
Debido a que el mismo elemento en la matriz no se puede usar dos veces, no hay [2,2,3,4],target=6
circunstancias similares
Pero no descarte [2,5,3,4],target=7
el caso, entonces lo predeterminado es volver a la primera respuesta.
Después de pensar en los dos problemas anteriores, comience a pensar en soluciones
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(i=0;i<nums.size()-1;i++)
{
for(j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
return {
i,j};
}
}
}
return {
};
};
};
Resumen: El método es simple pero la complejidad del tiempo es O (n 2 ). La complejidad del espacio es O (1),
velocidad de ejecución lenta y gran consumo de espacio de memoria
Tabla hash de dos pasadas:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//建立hash表存放数组元素
vector<int> b(2,-1);//存放结果
for(int i=0;i<nums.size();i++)
a.insert(map<int,int>::value_type(nums[i],i));
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))
//判断是否找到目标元素且目标元素不能是本身
{
b[0]=i;
b[1]=a[target-nums[i]];
break;
}
}
return b;
};
};
Una tabla hash
Mejora: mientras iteramos e insertamos elementos en la tabla, también regresaremos y comprobaremos si el elemento de destino correspondiente al elemento actual ya existe en la tabla. Si existe, entonces hemos encontrado la solución correspondiente y la devolvemos inmediatamente.
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//提供一对一的hash
vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0)
{
b[0]=a[target-nums[i]];
b[1]=i;
break;
}
a[nums[i]]=i;//反过来放入map中,用来获取结果下标
}
return b;
};
};