前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-15-3Sum&&4Sum

LeetCode-15-3Sum&&4Sum

作者头像
小二三不乌
发布2018-08-07 17:34:45
5730
发布2018-08-07 17:34:45
举报

15. 3Sum

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

代码语言:javascript
复制
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

同之前的2sum差不多,计算两个的和的方式是:为了避免重复,重新用一个set容器,解决重复的问题。但是这里的情况是,重复的一个数字是可以出现的,而且是三个数字相加的和,所以我们没法用之前的处理办法。

很容易想到的办法是,先让一个指针向前走,然后对之后的数字搜索,为了减少搜索的复杂度,我们可以先将数组进行排序,先排序后搜索,可以从O(n^2)的复杂度减小到nlog(n),所以采用先排序。

然而这里需要注意的是,需要判断数组中有相同数字的情况。虽然结果中允许有相同的数字出现,但不允许出现完全相同的两个结果,所以需要处理这种情况。 具体的代码如下:

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        if(nums.size()<=0)
            return res;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size()&&nums[i]<=0;++i){
            int j=i+1,k=nums.size()-1;
            while(j<k){
                    if(nums[i]+nums[j]+nums[k]<0)
                        j++;
                    else if(nums[i]+nums[j]+nums[k]>0)
                        --k;
                    else if(nums[i]+nums[j]+nums[k]==0){
                        vector<int> temp(3,0);
                        temp[0]=nums[i];
                        temp[1]=nums[j];
                        temp[2]=nums[k];
                        res.push_back(temp);
                        while(k>j&&nums[k]==temp[2]) //去除k的重复
                            k--;
                        while(k>j&&nums[j]==temp[1]) //去除j的重复
                            j++;
                    }
                }
                while(i+1<nums.size()&&nums[i+1]==nums[i])  //去除i的重复
                    i++;
            }
        return res;
    }
};

18. 4Sum

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 : The solution set must not contain duplicate quadruplets.

其实跟前面的3sum解决的办法是一样的,无非这里为了减少一点复杂度,借用了一下大家使用的方法。,在每次遍历的时候进行一点判断,以减少循环的次数。代码如下:

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        int n=nums.size();
        if(n<4)
            return res;
        sort(nums.begin(),nums.end());
        for(int i=0;i<n-3;++i){
            if(i>0&&nums[i]==nums[i-1]) continue;
            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
            if(nums[i]+nums[n-1]+nums[n-2]+nums[n-3]<target) continue;
            for(int j=i+1;j<nums.size()-2;++j){
                if(j>i+1&&nums[j]==nums[j-1]) continue;
                if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
                if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target) continue;
                int begin=j+1,end=n-1;
                while(begin<end){
                    int sum=nums[i]+nums[j]+nums[begin]+nums[end];
                    if(sum>target)
                        --end;
                    else if(sum<target)
                        ++begin;
                    if(sum==target){
                        vector<int> temp(4,0);
                        temp[0]=nums[i];
                        temp[1]=nums[j];
                        temp[2]=nums[begin];
                        temp[3]=nums[end];
                        res.push_back(temp);
                        while(begin<end&&temp[2]==nums[begin])
                            ++begin;
                        while(begin<end&&temp[3]==nums[end])
                            --end;
                    }
                }
            }
        }
         return res;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 15. 3Sum
  • 18. 4Sum
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档