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是一类问题,核心是如何高效地遍历三元组。关键点是三元组排序,然后固定第一个元素,对第二和第三个元素通过左右指针从头尾两边向内进行遍历。相关文章推荐
- [LC解题报告]16. 3Sum Closest
- LeetCode解题报告—— Container With Most Water & 3Sum Closest & Letter Combinations of a Phone Number
- LeetCode 解题报告 3Sum Closest
- [LeetCode 解题报告]016. 3Sum Closest
- Leetcode 1. Two Sum & 15. 3Sum & 16. 3Sum Closest & 18. 4Sum
- leetcode 16. 3Sum Closest
- LeetCode-16. 3Sum Closest
- [Leetcode] 681. Next Closest Time 解题报告
- 【LeetCode】3Sum 解题报告
- leetcode16. 3Sum Closest
- [LeetCode] 3Sum 解题报告
- leetcode 16. 3Sum Closest
- 【LeetCode】16. 3Sum Closest
- 3Sum LeetCode 解题报告
- LeetCode 16. 3Sum Closest
- Leetcode 16. 3Sum Closest
- 【LeetCode】270.Closest Binary Search Tree Value(Easy)解题报告
- 【LeetCode】16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- LeetCode 16. 3Sum Closest