Leetcode 15. Suma de tres números (ordenar + doble puntero)

Miércoles 3 de marzo de 2021, hace buen tiempo [No lamentes el pasado, no desperdicies el presente, no temas el futuro]



1. Introducción

Leetcode 15. Suma de tres números
Inserte la descripción de la imagen aquí

2. Solución de problemas (ordenar + doble puntero)

La idea principal: clasificación + doble puntero , la dificultad es cómo eliminar la duplicación .

El flujo del algoritmo es el siguiente:
Inserte la descripción de la imagen aquí

class Solution {
    
    
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
    
    
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        const int n = nums.size();
        for(int i=0;i<n;++i){
    
    
            // 特判(剪枝)
            if(nums[i]>0) return res;
            // 如果第一个元素重复,提前退出
            if(i>0 && nums[i]==nums[i-1]) continue;

            int beg = i+1, end = n-1;
            while(beg<end){
    
    
                if(nums[beg]+nums[end]==-nums[i]){
    
    
                    // 保存符合条件的三元组
                    res.push_back({
    
    nums[beg],nums[end],nums[i]});

                    // *重点:对第二个和第三个元素进行去重
                    while(beg<end && nums[beg]==nums[beg+1]) ++beg;
                    while(beg<end && nums[end]==nums[end-1]) --end;
                    ++beg;
                    --end;
                }
                else if(nums[beg]+nums[end]>-nums[i])
                    --end;
                else
                    ++beg;
            }
        }
        return res;
    }
};

referencias

https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/

Supongo que te gusta

Origin blog.csdn.net/m0_37433111/article/details/114329279
Recomendado
Clasificación