Leetcode 18 四数之和 学习感悟

思路:

设置 i j k n 四个游标,思想如同三数之和

# include<iostream>
# include<vector>
# include<string>
# include<algorithm>
# include<math.h>
# include<climits>
using namespace std;
vector<vector<int>> fourSum(vector<int>& nums, int target) {
	int i=0, j, k, n;
	int size = nums.size();
	vector<vector<int>>res;
	sort(nums.begin(), nums.end());//将nums有序化
	while (i < size - 3) {//i的活动范围 
		 j = i + 1;
		while (j < size - 2) {//j的活动范围
			k = j + 1;
			n = size - 1;
			while (k < n) {
				if ((nums[i] + nums[j] + nums[k] + nums[n]) > target) {
					n--;
					while (k < n && nums[n] == nums[n + 1])n--;
				}
				else if ((nums[i] + nums[j] + nums[k] + nums[n]) < target) {
					k++;
					while (k < n && nums[k] == nums[k - 1])k++;
				}
				else {//与target一致
					res.push_back({ nums[i] , nums[j] , nums[k] , nums[n] });//将此数组入vector 
					k++;
					while (k < n && nums[k] == nums[k - 1])k++;
					n--;
					while (k < n && nums[n] == nums[n + 1])n--;
				}
			}//k<n的循环
			j++;
			while (j < size - 2 && nums[j] == nums[j - 1])j++;
		}
		i++;
		while (i < size - 3 && nums[i] == nums[i - 1])i++;
	}
	return res;
}
int main(void) {
	vector<int> nums;
	nums.push_back(-3);
	nums.push_back(-2);
	nums.push_back(-1);
	nums.push_back(0);
	nums.push_back(0);
	nums.push_back(1);
	nums.push_back(2);
	nums.push_back(3);
	vector<vector<int>>res;
	res = fourSum(nums, 0);
	for (int i = 0; i < res.size(); i++) {
		for (int j = 0; j < res[i].size(); j++) {
			cout << res[i][j] << " ";
		}
		cout << endl;
	}
	return  0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值