leetcode---------3Sum Closet

这一题,拿到手之后,我一开始有点懵逼,但是昨天刚做了3SUM,想必一定有关系,于是,调试了一下,超过了99%,哈哈

这一题,其实和昨天是相似得,每一次都遍历一个节点,剩下得就从下一个和最后一个开始缩小范围去搜索,如果此时和大于target,说明此时右边太大了,(当然得先排序),就hi--;同理,和过小,就lo++;此时比较接近程度,并更新;

当第一个元素就超过了target,那后面就没必要再算下去了;

class Solution {
public:
	int threeSumClosest(vector<int>& nums, int target) {
		int close_degree = 999;
		int value = 0;
		int lo = 0;
		int hi = 0;
		int sum = 0;
		sort(nums.begin(), nums.end());
		for (int i = 0; i < nums.size() - 2; ++i)
		{
			if (i>0&&nums[i] >= target) break;
			lo = i + 1;
			hi = nums.size() - 1;
			if (i==0||(i > 0 && nums[i] != nums[i - 1]))
			{
				sum = nums[i] + nums[lo] + nums[hi];
				if (abs(sum - target) < close_degree)
				{
					value = sum;
					close_degree = abs(sum - target);
				}
				while (true)
				{
					if (sum < target) ++lo;
					else hi--;
					if (lo >= hi)	break;
					sum = nums[i] + nums[lo] + nums[hi];
					if (abs(sum - target) < close_degree)
					{
						value = sum;
						close_degree = abs(sum - target);
					}
				}
			}
		}
		return value;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值