• 三/四 数之和,双指针法,细节很多


    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    class Solution {
    public:
        vector<vector<int> > threeSum(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            vector<vector<int> >res;   
            int _size=nums.size();    
            if(_size<3||nums.front()>0||nums.back()<0)
            return res;
            int i,j,k;
            for(k=0;k<=_size-3;k++){
                if(nums[k]>0)
                    break;
                if(k>0&&nums[k]==nums[k-1])
                    continue;                               //跳过无意义移动
                i=k+1;j=_size-1;
                while(i<j){
                    if(nums[i]+nums[j]+nums[k]>0)
                        j--;
                    else if(nums[i]+nums[j]+nums[k]<0)
                        i++;
                    else{
                        res.push_back({nums[i],nums[j],nums[k]});
                        while(i<j&&nums[i]==nums[i+1])      //跳过无意义移动
                            i++;
                        while(i<j&&nums[j]==nums[j-1])      //同上
                            j--;
                        i++;
                        j--;           //这里可以两边同时缩近,缩一边没啥用hahaha。
                    }
                }
            }
            return res;
        }
    };

     四数之和  外层多了一个嵌套而已

    for(k=0;k<s-3;k++)
            {
                if(k>0&&nums[k]==nums[k-1]) continue;
                for(l=k+1;l<s-2;l++)
                {if(l>k+1&&nums[l]==nums[l-1])
                    continue;  
                i=l+1;j=s-1;
                while(j>i)
                {
                    if(nums[i]+nums[j]+nums[k]+nums[l]<target)
                    {
                        i++;
                    }
                    else if(nums[i]+nums[j]+nums[k]+nums[l]>target)
                    {
                        j--;
                    }
                    else{
                        res.push_back({nums[i],nums[j],nums[k],nums[l]});
    while(i<j&&nums[i]==nums[i+1])
                    {
                        i++;
                    }
                    while(i<j&&nums[j]==nums[j-1])
                    {
                        j--;
                        
                    }
                        i++;j--;
                    }
                    
                    }}
    
    
                }return res;
  • 相关阅读:
    精英程序员
    C语言(2)
    C语言练习
    C语言工具---Code::Blocks
    C语言(1)
    【udacity】机器学习-神经网络
    【udacity】机器学习-回归
    【udacity】机器学习-决策树
    【术语记录】机器学习
    python入门(九):目录操作
  • 原文地址:https://www.cnblogs.com/lau1997/p/12686539.html
Copyright © 2020-2023  润新知