15. 3Sum的C++解法

利用之前做过两数之和的思路,可以固定一个数字,剩下的按两数之和的方法进行查找。
1.为了防止重复,查找从固定数字的后面找。
2.同一个固定数字下也有可能解不唯一,所以循环不能是找到符合条件的就退出,而应该遍历所有可能。
3.随时判断越界和下标相等。
4.技巧:如果taget已经是正数了就终止,因为后面不可能出现和为零的组合了。
 

class Solution {
public:
	vector<vector<int>> threeSum(vector<int> &numbers) {
		vector<vector<int>> res;
		sort(numbers.begin(), numbers.end());
		int l = numbers.size();
		for (int k = 0; k < l-2; k++)
		{
            if(numbers[k]>0) break;
			if ((k>0)&&(numbers[k] == numbers[k - 1])) continue;
			int target = -1* numbers[k];
			int i =k+1;
			int j = numbers.size() - 1;
			while (i<j)
			{
				if (numbers[i] + numbers[j] > target)j--;
				if (numbers[i] + numbers[j] < target) i++;
				if (numbers[i] + numbers[j] == target && i!=j)
				{
					res.push_back(vector < int > { numbers[k], numbers[i], numbers[j] });
					while (i < j && numbers[i] == numbers[i + 1]) ++i;
					while (i < j && numbers[j] == numbers[j - 1]) --j;
					i++;
					j--;
				}
			}	
		}
		return res;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值