LeetCode18:4Sum

LeetCode18:4Sum

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Given an array S of n integers, are there elements a, b, c, 
and d in S such that a + b + c + d = target? Find all 
unique quadruplets in the array which gives the sum of target.

Note:
Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
The solution set must not contain duplicate quadruplets.
    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)

这是求四个数的和的问题。能够和前面三个数和的问题一样转化成两个数和的问题。即先固定第一个数。再依据第一个数固定第二个数,然后就是求两数和的问题了。数组里面的元素可能会有反复元素,所以须要注意消除反复的推断。时间复杂度是O(N^3)。

runtime:192ms

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        if(nums.size()<4)
            return result;

        sort(nums.begin(),nums.end());
        vector<int>::iterator iter1=nums.begin();
        vector<int>::iterator iter2=iter1+1;

        //最外层第一个指针遍历
        for(;iter1!=nums.end()-3;iter1++)
        {

            //固定第一个指针后第二个指针遍历
            for(iter2=iter1+1;iter2!=nums.end()-2;iter2++)
            {

                //内层两个指针从两个方向遍历,这是经典的求两个数的和的问题
                int base=*iter1+*iter2;
                vector<int>::iterator iter3=iter2+1;
                vector<int>::iterator iter4=nums.end()-1;
                while(iter3<iter4)
                {
                    if((*iter3+*iter4+base)<target)
                    {
                        iter3++;
                    }
                    else if((*iter3+*iter4+base)>target)
                    {
                        iter4--;
                    }
                    else
                    {
                        //这里须要注意vector中push_back和用下标訪问的差别,用小标訪问时相似于数组,所以tmp初始化时须要指定vector的大小,可是用push_back时不要指定大小。否则小心push_back是在你指定大小的vector后加入元素
                        vector<int> tmp;
                        tmp.push_back(*iter1);
                        tmp.push_back(*iter2);
                        tmp.push_back(*iter3);
                        tmp.push_back(*iter4);
                        result.push_back(tmp);

                        //这是推断是否有反复的方式,假设下一指针依旧小于iter4而且下一个指针指向的值与当前值同样。iter3须要加1
                        while((iter3+1)<iter4 && *(iter3)==*(iter3+1)) iter3++;

                        while(iter3<(iter4-1)&& *(iter4)==*(iter4-1)) iter4--;

                        //推断完毕后还须要将iter3加1或iter4减一以继续查寻下一个和为常数的组合
                        iter3++;
                    }
                }

                //对于iter2也须要推断是否存在反复元素问题
                while(((iter2+1)!=(nums.end()-2))&&(*(iter2)==*(iter2+1))) iter2++;

            }

            //同理对于ier1也是如此
            while(((iter1+1)!=(nums.end()-3))&&(*(iter1)==*(iter1+1))) iter1++;

        }
          return result;   
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python安装教程[通俗易懂]

    python安装教程[通俗易懂]python安装教程本章节我们将向大家介绍如何在本地搭建Python开发环境。Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python&

    2022年7月5日
    23
  • jboss版本_输入法下载

    jboss版本_输入法下载昨天和今天到jboss区下载jboss4.0.4或者其他版本,没有一个下的了,太烂了,网站怎能这样,现在是什么时代呀,免费的或者收费的服务都应该要做的很好才是.感觉现在的软件的功能远远没有达到我心目中理想的位置,也不知何年何月我才对会软件的功能称好!也许软件就是这样吧,开发要成本,做得很好是几乎不可能的了.

    2022年9月28日
    1
  • Java学习路线图(完整详细2021版)

    Java学习路线图(完整详细2021版)作为一个男人我感觉必须得做点什么来证明一下自己,现在我又回来了,准备把自己的节操准备补一下 另外给各位未来的Java程序员说一句,别的我不清楚,学习编程请从一而终 咱们学习编程就挺难的,有这些先驱者来带领咱们学习,咱们应该感激,而且最重要的事跟着你选定的一家一直学下去 因为每家学校的学习大纲都是不一样的,但是程序员其实都是一样的,这句话你细品!仔细的品! 我不希望你忙忙碌碌的整理那么多东西,挑肥拣瘦的,最后自己学的东西还是缺失的,要不就…

    2022年5月17日
    85
  • 网站的栏目页是什么_栏目页

    网站的栏目页是什么_栏目页功能说明栏目子分类列表,栏目导航适用范围首页模板,列表模板,内容模板基本语法[NT:unLoop,NT:SiteID=0,NT:LabelType=ClassNavi,NT:ClassID=ClassID,NT:HrefCSS=HrefCSS,NT:NaviChar=NaviChar,NT:isDiv=false,NT:Cols=1][/NT:unLoop…

    2022年9月28日
    0
  • 新式单片机视频教程下载

    新式单片机视频教程下载新式单片机视频教程下载点击此处进入下载页面【文件名称】——国内首创新式单片机视频教程【文件描述】单片机学习资料,新手绝佳教程….【注意事项】压缩包内为种子文件需使用BT类软件下载;转载自btpig.com。–注:1.本人发资源纯为与诸位共享,发布前均做过测试保证可用。2.如果下载后打不开请重新再试,可能是网络传输问题。3.如有疑问请访问【http://blog.csdn.net/soft

    2022年4月28日
    42
  • Java–foreach循环

    Java–foreach循环Java foreach 循环 foreach 是 Java5 新增 在遍历数组 集合的时候有不错的性能 foreach 的语法格式 for 元素类型每次循环的元素名称 循环对象 一 常见的使用方式 nbsp nbsp nbsp nbsp 1 遍历数组 publicstatic String args String

    2025年6月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号