título Descripción
darle una matriz de enteros que contienen los nums n, determina si hay tres elementos a, b, c nums tal que a + b + c = 0? Por favor, no satisfacer las condiciones que encuentre todos los triples duplicados.
Nota: La respuesta no puede contener triples duplicados.
pensamiento
- Primeros nums ordenar cp_nums obtenidos, y luego presiona secuencialmente en un cp_nums digitales, y la suma de los tres y dos diseñado para el número de preguntas que señalar que cuando se pulsa en una duplicación digital si es necesario saltar, como el último de la prensa es -1, que no necesitamos esto de nuevo empujado, de lo contrario se repetirán. Y los dos números se resuelven por la doble puntero, un puntero al comienzo, un punto en el extremo, y es mayor que el objetivo de la izquierda y la mano derecha, la mano izquierda o la derecha, si se juzga si la duplicación es igual a (0,0,0 este caso, por ejemplo ), si no se repita la respuesta es empujado.
código
Método uno:
class Solution {
vector<int> res_p;
vector<vector<int>> res;
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> cp_nums;
if(nums.size()<3)
return res;
for(int i = 0; i < nums.size();i++)
cp_nums.push_back(nums[i]);
sort(cp_nums.begin(),cp_nums.end()); /*数字排序*/
for (int i = 0; i < cp_nums.size() - 2; i++)
{
if (i > 0 && cp_nums[i] != cp_nums[i - 1] || i == 0) /*避免重复压入求两数之和*/
{
vector<int> rest;
rest.assign(cp_nums.begin() + i + 1, cp_nums.end());
Twosum(rest, -cp_nums[i]);
}
}
return res;
}
void Twosum(vector<int> num, int target)
{
int record = num[0]-1; /*记录上次求得的两数之和的left指针指向的数*/
int left = 0, right = num.size()-1;
while(left<right)
{
if(num[left] + num[right] < target)
left++;
else if(num[left] + num[right] > target)
right--;
else
{
if(num[left] != record) /*避免重复压入*/
{
res_p.push_back(-target);
res_p.push_back(num[left]);
res_p.push_back(num[right]);
res.push_back(res_p);
res_p.clear();
record = num[left];
}
left++;
}
}
}
};