ter Leetcode y el número de

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

  1. 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++;
            }
        }  
     }
};
Publicado 85 artículos originales · ganado elogios 0 · Vistas 385

Supongo que te gusta

Origin blog.csdn.net/weixin_38312163/article/details/104981644
Recomendado
Clasificación