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)
上一篇 2022年1月17日 下午6:00
下一篇 2022年1月17日 下午7:00


相关推荐

  • SortedSet接口

    SortedSet接口13 5 nbsp SortedSet 接口从 TreeSet 类的定义中可以发现 TreeSet 中实现了 SortedSet 接口 此接口主要用于排序操作 即实现此接口的子类都属于排序的子类 SortedSet 接口定义如下 public nbsp interface nbsp SortedSet nbsp extends nbsp Set nbsp 发现此接口也继承了 Set 接口 此接口中定义了如表 13 7 所示的方法 表 13 7 nbsp SortedSe

    2026年3月26日
    2
  • 遍历hashMap的5种方法

    遍历hashMap的5种方法1 使用 Iterator 遍历 HashMapEntry 使用 Iterator 遍历 HashMapKeySe 使用 For each 循环迭代 HashMap4 使用 Lambda 表达式遍历 HashMap5 使用 StreamAPI 遍历 HashMap1 使用 Iterator 遍历 HashMapEntry java tutorials iterations importjava util HashMap import

    2026年3月18日
    2
  • 负数补码的移位规则

    负数补码的移位规则由原码求得补码的方法 1 定义法补码解决了计算机在进行数值运算的两个问题 一个是减法运算能不能使用加法电路 另一个是原码中 0 的表示不唯一 正数的补码就是其原码 整数负数的补码是 真值 以 2 为底以数值位数加一为指数的幂 模 即以这个幂为模的补数 这里描述下补码的几何意义 大家可以画一个数轴 假定数值位有三位 模是 16 那么加上一位符号位 数轴从 0 000 开始往右依次加一是 0 001 0 010 0 011 0 111 共八个数 这个时候如果继续

    2026年3月17日
    4
  • Eclipse使用新手教程

    Eclipse使用新手教程

    2021年11月24日
    61
  • Siege压测使用和说明

    Siege压测使用和说明原文地址 http blog csdn net shero zsmj article details siege 是一个压力测试和评测工具 可以根据配置对一个 WEB 站点进行多用户的并发访问 记录每个用户所有请求过程的相应时间 并在预定义并发量下重复进行 siege 可以从预定义列表中获取随机的 URL 所以 siege 可用于仿真用户请求负载 一 siege 工具安装

    2026年3月19日
    3
  • RecyclerView网格布局

    RecyclerView网格布局GridLayoutMa

    2026年3月18日
    2

发表回复

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

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