zoukankan      html  css  js  c++  java
  • 三/四 数之和,双指针法,细节很多

    给你一个包含 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;
  • 相关阅读:
    备忘:java在cmd中编译运行
    Java基础学习 —— 对象的克隆
    将博客搬至CSDN
    jenkins节点管理中没有默认没有Launch agent via Java Web Start
    postman 集成ci
    postman初级使用
    jmeter分布式压测实践及踩坑记录(linux压力机)
    jmeter监控服务器cpu、内存等
    jmeter跨线程组传递token实践
    初识jmeter
  • 原文地址:https://www.cnblogs.com/lau1997/p/12686539.html
Copyright © 2011-2022 走看看