18. 4Sum(C++)

本文介绍了一种解决四数之和问题的高效算法。针对给定整数数组及目标值,寻找所有不重复的四元组组合,使得其和等于目标值。通过排序和双指针技巧避免重复解,并提供了完整的C++实现代码。

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: 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]
]

Solution :
 1 class Solution {
 2 public:
 3     vector<vector<int>> fourSum(vector<int>& nums, int target) {
 4         vector<vector<int>> res;
 5         if(nums.empty()) return res;
 6         std::sort(nums.begin(),nums.end());
 7         int len=nums.size();
 8         for(int i1=0;i1<len;i1++){
 9             for(int i2=i1+1;i2<len;i2++){
10                 int i3=i2+1;
11                 int i4=len-1;
12                 while(i3<i4){
13                     int sum=nums[i1]+nums[i2]+nums[i3]+nums[i4];
14                     if(sum>target){
15                         i4--;
16                     }else if(sum<target){
17                         i3++;
18                     }else{
19                         vector<int> tmp(4,0);
20                         tmp[0]=nums[i1];
21                         tmp[1]=nums[i2];
22                         tmp[2]=nums[i3];
23                         tmp[3]=nums[i4];
24                         res.push_back(tmp);
25                         while(i3<i4&&nums[i3]==tmp[2]) i3++;
26                         while(i3<i4&&nums[i4]==tmp[3]) i4--;
27                     }
28                 }
29                 while(i2+1<len&&nums[i2]==nums[i2+1]) i2++;
30             }
31             while(i1+1<len&&nums[i1]==nums[i1+1]) i1++;
32         }
33         return res;
34     }
35 };

 

转载于:https://www.cnblogs.com/devin-guwz/p/6506891.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值