leetcode刷题. 18. 四数之和. 双指针解法

本文深入探讨了如何寻找数组中是否存在四个数的和等于给定目标值的问题,通过详细的算法实现,展示了如何有效地找到所有可能的四元组合,并确保结果中没有重复的组合。文章重点介绍了使用排序和双指针技巧来优化搜索过程,减少计算复杂度。

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

 

这里需要考虑去重。 

vector<vector<int>> fourSum(vector<int>& nums, int target) {

	vector<vector<int>> output;
	// 先排序
	std::sort(nums.begin(), nums.end());

	for (int i = 0; i < nums.size();) {

		for (int j = i + 1; j < nums.size();) {

			int p1 = j + 1, p2 = nums.size() - 1;
			while (p1 < p2) {

				int sum = target - nums[i] - nums[j];

				if (nums[p1] + nums[p2] < sum) p1++;
				else if (nums[p1] + nums[p2] > sum) p2--;
				else {
					output.push_back({ nums[i], nums[j], nums[p1], nums[p2] });
					
                    int tmp1 = nums[p1++];
                    int tmp2 = nums[p2--];
                    while(p1 < p2 && nums[p1] == tmp1 && nums[p2] == tmp2){
                        p1++; p2--;
                    }
				}
			}
			int tmpj = nums[j];
			while (++j < nums.size() && nums[j] == tmpj);
		}
		int tmpi = nums[i];
		while (++i < nums.size() && nums[i] == tmpi);
	}
	return output;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值