leetcode: 3SumClosest
2015-05-06 10:22
246 查看
题目:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers.
You may assume that each input would have exactly one solution.
Hide Tags
Array Two
Pointer
*******************************************************************************************************************************************************************
算法思想:还是跟前面 2Sum,3Sum的思想一样,先排序,再利用2个指针,一前一后;设三个数的和为sum;;最后返回的结果记为 ret; 每次得到一个sum时,比较 ret 和
sum 距离 target 的大小,更新ret;然后根据 sum 和 target 的大小来决定两个指针的移动。
具体的代码如下:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers.
You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Hide Tags
Array Two
Pointer
*******************************************************************************************************************************************************************
算法思想:还是跟前面 2Sum,3Sum的思想一样,先排序,再利用2个指针,一前一后;设三个数的和为sum;;最后返回的结果记为 ret; 每次得到一个sum时,比较 ret 和
sum 距离 target 的大小,更新ret;然后根据 sum 和 target 的大小来决定两个指针的移动。
具体的代码如下:
int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(), nums.end());// 排序 int len = nums.size(); int sum = 0; //中间过程的结果 int ret = 0; //要返回的结果 int l = 0, r = len-1; bool first = true; // 判断是否是第一次计算sum的值 for (int i = 0; i < len - 2; ++i) { l = i + 1; r = len - 1; while (l < r) { sum = nums[i] + nums[l] + nums[r]; if (first) { ret = sum; //第一次计算sum的值的时候,用sum来初始化ret first = false; } else { //比较上一次 ret 和这次计算的sum ,谁距离target更近;更新ret的值 if (abs(ret - target)>abs(sum - target)) ret = sum; } if (ret == target) //若ret和target相等,则返回ret的值 return ret; if (sum < target) // 在遍历当前第i的元素时,若sum比target小,则左边的指针向右移动 { ++l; } if (sum>target) { --r; } } } return ret; } void main() { vector<int> nums = { 1, 2, 4, 8, 16, 32, 64, 128 }; int target = 82; // 2 16 64 int ret = threeSumClosest(nums, target); cout << ret << endl; }
<span style="font-size:18px;color:#cc0000;">已经将 2Sum,3Sum,3SumClosest 这几题都做完了,还有一道4Sum没做;其实这都是一类问题,等4Sum做完了,再来写一篇博文对这类题目进行下总结,嗯,记住</span>!
相关文章推荐
- leetcode - 3Sum Closest
- leetcode[16]3Sum Closest
- [leetcode 16] 3Sum Closest
- leetcode---3Sum Closest
- [leetcode] 3Sum Closest
- LeetCode:3Sum Closest
- 【JAVA、C++】LeetCode 016 3Sum Closest
- Leetcode016 3Sum Closest
- [LeetCode][JavaScript]3Sum Closest
- 【LeetCode】3Sum Closest
- Leetcode 16[medium]--3Sum Closest
- LeetCode 016 3Sum Closest
- LeetCode 3Sum Closest
- [Leetcode]3Sum Closest
- Leetcode习题记录——3Sum Closest
- 【Leetcode】3Sum Closest
- leetcode解题之 16. 3Sum Closest Java版(结果离目标值最近三个数字和)
- Leetcode-3Sum Closest
- LeetCode 遍历技巧 | 16. 3Sum Closest
- Leetcode || 3Sum Closest