LeetCode 18

如果说求两个数相加是轻松,那么求三个数相加则是痛苦,如果说求四个数相加呢-----绝望。

没错,拿到这个题的时候确实有些绝望,但是既然开发这个题的人如此刁难我们,我们也不能放弃,不要辜负别人的一番好意,所以我咬牙继续。

经历过前面的风雨,我们也学会了成长,这道题是建立在前面的题的基础上而开始的。题目的要求比较严格,要求四个数的和和target的值相等,且四个数字不重复且升序。

所以我们得一个一个的去试探,也就是遍历,这个应该得循环嵌套的遍历,因为我们不能放过每一种情况,因为它可能在包含在我们要求的情况中。思路其实不难,代码如下:

class Solution {
public:
	vector<vector<int>> fourSum(vector<int>& nums, int target) {
		vector<vector<int> > last;
		int len = nums.size();
		if (len < 4)
		{
			return last;
		}
		//1.排序
		sort(nums.begin(), nums.end());
		//遍历
		//特殊处理一下,若最小的四个数的和比target还大或者最大的四个数的和比target还大,那么我们直接退出
		if (nums[len - 1] + nums[len - 2] + nums[len - 3] + nums[len - 4] < target)
		{
			return last;
		}
		if (nums[0] + nums[1] + nums[2] + nums[3] > target)
		{
			return last;
		}
        //循环遍历,不能重复,那么必须得一个一个的试,因为排序了,所以情况的复杂性减少了很多
		for (int i = 0; i < len - 3; ++i)
		{ //1层
			while (i > 0 && nums[i] == nums[i - 1])
			{//处理重复数字,但是第一次遍历到的时候不能处理掉,否则可能错过一些解
				++i;
			}
			for (int j = i + 1; j<len - 2; ++j)
			{ //2层
				while (j > i + 1 && nums[j] == nums[j - 1])
				{//处理重复数字,但是第一次遍历到的时候不能处理掉,否则可能错过一些解
					++j;
				}
				int pos1 = j + 1;
				while (pos1 < len - 1)
				{ //3层
					while (pos1>j + 1 && nums[pos1] == nums[pos1 - 1])
					{//处理重复数字,但是第一次遍历到的时候不能处理掉,否则可能错过一些解
						++pos1;
					}
					int pos2 = pos1 + 1;
					while (pos2 < len && nums[i] + nums[j] + nums[pos1] + nums[pos2] < target)
					{
						++pos2;
					}
					if (pos2 == len)
					{
						++pos1;
						continue;
					}
					if (nums[i] + nums[j] + nums[pos1] + nums[pos2] == target)
					{
						vector<int> tmp;
						tmp.push_back(nums[i]);
						tmp.push_back(nums[j]);
						tmp.push_back(nums[pos1]);
						tmp.push_back(nums[pos2]);
						last.push_back(tmp);
						++pos1;
						continue;
					}
					if (nums[i] + nums[j] + nums[pos1] + nums[pos2] > target)
					{//
						++pos1;
						continue;
					}
				}
			}
		}
		return last;
	}
};
我总结了一下这类题的做法,不要被题目所吓倒,你要相信,前面有很多人作对过,所以我们也是可以作对的,我的代码是正确的,是经过平台测试的,测试结果如下:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值