leetcode 3Sum Closest
2013-09-30 13:02
267 查看
题目描述:给定一个包含n个整数的数组S和目标整数target,在S中找3个整数,使得这3个整数的和最接近target题目来源:http://oj.leetcode.com/problems/3sum-closest/题目分析:先对数组排序,然后枚举最小的数n1,对于第二和三个数,用两个索引l和r从两端往中间夹击找,找最接近target - n1的两个数,可以通过“求在一个数组中找两个数,使这两个数的和最接近目标整数newTarget”。正确性说明,假设排好序的数组为S1,S2...Si...Sj...Sn,假定最终Si + Sj最接近目标整数newTarget(1)若Si + Sj < newTarget 那么Si-k + Sj < newTarget,Si + Sj+k > newTarget(如果:Si + Sj+k < newTarget,那么Si和Sj不是最优值)当l先到达i时,Si + Sj+k > newTarget,r会减小至j;当r先到达j时,Si-k + Sj < newTarget,l会增加至i。(2)若Si + Sj > newTarget 那么Si + Sj+k > newTarget,Si-k + Sj < newTarget(如果:Si-k + Sj > newTarget,那么Si和Sj不是最优值)当l先到达i时,Si + Sj+k > newTarget,r会减小至j;当r先到达i时,Si-k + Sj < newTarget,l会增加至i。所以总会找到最优值时间复杂度:O(n^2)示例代码:
int threeSumClosest(vector<int> &num, int target) { int len = num.size(); int closestSum = 2147483647, result; sort(num.begin(), num.end()); for(int i = 0; i != len - 2; ++i) { int l = i + 1, r = len - 1; while(l < r) { int tmpSum = num[l] + num[r] + num[i]; if(abs(tmpSum - target) < closestSum) { closestSum = abs(tmpSum - target); result = tmpSum; } tmpSum > target ? --r : ++l; } } return result; }
相关文章推荐
- leetcode 第16题 3Sum Closest
- leetcode -- 3Sum Closest
- LeetCode#15* 3Sum && LeetCode#16 3Sum Closest && LeetCode#18 4Sum
- LeetCode16 3Sum Closest
- LeetCode: 3SumClosest
- LeetCode No.16 3Sum Closest
- [LeetCode] 16. 3Sum Closest
- leetcode16. 3Sum Closest
- [LeetCode] 3Sum Closest
- LeetCode 016 3Sum Closest
- leetcode之 3Sum Closest
- leetcode-16. 3Sum Closest
- (LeetCode 16) 3Sum Closest
- LeetCode 3Sum Closest
- leetcode.array--16. 3Sum Closest
- LeetCode 3Sum&&3Sum Closest&&4Sum
- [LeetCode]题解(python):016-3Sum Closest
- leetcode 16. 3Sum Closest
- leetcode 57: 3Sum Closest
- LeetCode 16. 3Sum Closest