LeetCode OJ:4Sum(4数字之和)

Given an array S of n integers, are there elements abc, 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)

和前面的思路基本上是相同的,这里同样容易遇见相同的数,这个时候需要跳过,代码如下:

 1 class Solution {
 2 public:
 3     vector<vector<int>> fourSum(vector<int>& nums, int target) {
 4         sort(nums.begin(), nums.end());
 5         int sz = nums.size();
 6         vector<vector<int>> ret;
 7         for(int i = 0; i < sz; ++i){
 8             if(i != 0 && nums[i] == nums[i - 1])
 9                 continue;
10             for(int j = i + 1; j < sz; ++j){
11                 if(j > i + 1 && nums[j] == nums[j - 1])
12                     continue;
13                 for(int beg = j + 1, end = sz - 1; beg < end;){
14                     while(beg > j + 1 && nums[beg] == nums[beg - 1])
15                         beg++;
16                     while(end < sz - 1 && nums[end] == nums[end + 1])
17                         end--;
18                     if(beg >= end) break;
19                     int sum = nums[i] + nums[j] + nums[beg] + nums[end];
20                     if(sum == target){
21                         vector<int> tmp;
22                         tmp.push_back(nums[i]);
23                         tmp.push_back(nums[j]);
24                         tmp.push_back(nums[beg]);
25                         tmp.push_back(nums[end]);
26                         ret.push_back(tmp);
27                         beg++, end--;
28                     }else if(sum < target){
29                         beg++;
30                     }else{
31                         end--;
32                     }
33                 }
34             }
35         } 
36         return ret;
37     }
38 };

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4921928.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值