您的位置:首页 > 其它

leetcode解题报告16. 3Sum Closest

2017-05-14 16:48 477 查看

leetcode解题报告16. 3Sum Closest

题目地址

难度是medium

题目描述

和3SUM问题类似,输入一个整数数组,和一个目标整数target。从数组中选择3个数,使得这三个数之和最接近target。要求返回这三个数之和即可,不要求具体返回是哪三个数。默认有且只有一个解。

我的思路

同样地最简单的方法是三层循环暴力遍历即可。但是这一般不是我们相要的答案。

和3sum问题相比,其实我们可以发现这个问题是比3sum问题更简单的。同样是遍历所有三元组,这个问题不需要考虑三元组去重的问题,而且一旦找到等于target的结果即可返回,不要全部遍历完。

所以可以直接套用解决3sum问题时的遍历办法进行遍历。首先为了更好地遍历,对输入数组进行排序,而且我们假定三元组中元素是升序的,具体遍历时,先固定第一个元素(最小元素),再通过左右指针从数组的头尾分别遍历第二和第三个元素。如果当前结果相对target偏小,那么左指针向右移动,如果偏大,那么右指针向左移动,直到左右指针相遇。在整个遍历过程记录最接近的结果。如果遇到等于target的情况,则可以直接返回。

具体看代码。

我的代码

#include <algorithm>

using namespace std;

class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
vector<int> my_nums(nums.begin(), nums.end());
sort(my_nums.begin(), my_nums.end());
int cur_min = 1000000;
int ans;
for (int i = 0; i < my_nums.size() - 2; i++) {
int left = i + 1;
int right = my_nums.size() - 1;
int new_target = target - my_nums[i];
while (left != right) {
int cur = new_target - my_nums[left] - my_nums[right];
if (cur > 0) {
left++;
if (cur < cur_min) {
cur_min = cur;
ans = target - cur;
}
} else if (cur < 0) {
right--;
if (-cur < cur_min) {
cur_min = -cur;
ans = target - cur;
}
} else {
return target;
}
}
}
return ans;
}
};


阅读官方题解

没有官方题解,网上题解的思路和我的思路差不多。

思想核心总结

3sum是一类问题,核心是如何高效地遍历三元组。关键点是三元组排序,然后固定第一个元素,对第二和第三个元素通过左右指针从头尾两边向内进行遍历。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: