Leetcode 16 最接近三数之和 学习感悟

思路:首先整体思路还是之前的三数和游标的思想

当 i+j+k > 0  时候说明k取的数字大了,k--

当 i+j+k  <0  时候说明j取的数字小了, j++

只不过在每次计算过程加上count值和给定的target比较,每次比较res只保留最小的count的计算结果。

最终将res返回 

# include<iostream>
# include<vector>
# include<string>
# include<algorithm>
# include<math.h>
# include<climits>
using namespace std;
int threeSumClosest(vector<int>& nums, int target) {
	int i, j, k;
	int count = 0;
	int res=0,Min=INT_MAX;//res临时保存结果,Min保存最终结果
	i = 0; j = i + 1; k = nums.size() - 1;
	sort(nums.begin(), nums.end());//将vector有序化
	while (i < nums.size() - 2) {
		while (j < k) {
			if ((count = (nums[i] + nums[j] + nums[k])) > target) {
				if (abs(count - target) < Min) {
					Min = min(abs(count - target), Min);//比较最小值
					res = count;
				}
				k--;
				while (k > j && nums[k + 1] == nums[k])k--;
			}
			else if ((count = (nums[i] + nums[j] + nums[k])) < target) {
				if (abs(count - target) < Min) {
					Min = min(abs(count - target), Min);//比较最小值
					res = count;
				}
				j++;
				while (k > j && nums[j] == nums[j - 1])j++;
			}
			else {
				return target;
			}	
		}
		i++;
		while (i < nums.size() - 2 && nums[i] == nums[i - 1])i++;
		j = i + 1; k = nums.size() - 1;
	}
	return res;
}

int main(void) {
	vector<int> nums;
	nums.push_back(1);
	nums.push_back(1);
	nums.push_back(1);
	nums.push_back(0);
	cout << threeSumClosest(nums, -100);
	return  0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值