leetcode--16. 3Sum Closest
来源:互联网 发布:淘宝店铺多久才能有钻 编辑:程序博客网 时间:2024/06/05 18:08
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.
具体思路为:
step1:固定一个数字,for循环从0到len-2
step2:另外两个数字采用TwoClosest的方法,利用2 pointer进行求解。
时间复杂度为(O(N^3))
class Solution {public: int twoClosest(vector<int>& nums, int start, int len, int tar) { int min = INT_MAX; for(int i = start; i<len; i++){ int other = tar - nums[i]; for(int j = i+1; j<len; j++){ min = abs(min) > abs(nums[j] - other) ? (nums[j] - other) : min; } } return min; } int threeSumClosest(vector<int>& nums, int target) { int len = nums.size(); int min = INT_MAX; for(int i = 0; i< len; i++){ int sum = target - nums[i]; //two closest by input sum; int ret = twoClosest(nums, i+1, len, sum); min = abs(min) > abs(ret) ? ret : min; } return target + min; }};
利用two pointers可以将时间复杂度降低到n^2:
在Two closest处进行了优化。
class Solution {public: int twoClosest(vector<int>& nums, int start, int len, int tar) { int i = start; int j = len; int min = tar - (nums[i] + nums[j]); while(i<j){ int tmp = nums[i] + nums[j]; int new_min = abs(tar-tmp); if(abs(min) > new_min) min = tar - tmp; if(tar == tmp) return 0; else{ if(tar > tmp) i++; else j--; } } return min; } int threeSumClosest(vector<int>& nums, int target) { int len = nums.size(); sort(nums.begin(), nums.end()); int min = target - (nums[0] + nums[1] + nums[2]); for(int i = 0; i< len-2; i++){ int sum = target - nums[i]; //two closest by input sum; int ret = twoClosest(nums, i+1, len-1, sum); min = abs(min) > abs(ret) ? ret : min; } return target - min; }};
答案中更简洁的方法:
class Solution {public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int closest = nums[0] + nums[1] + nums[nums.size() - 1]; for(int i = 0; i < nums.size() - 2; i++){ int left = i+1, right = nums.size() - 1; while(left < right){ int sum = nums[left] + nums[right] + nums[i]; if(abs(sum - target) < abs(closest - target)) closest = sum; if(sum > target) right--; else if(sum < target) left++; else break; } } return closest; }};
阅读全文
0 0
- LeetCode 16. 3Sum Closest
- LeetCode --- 16. 3Sum Closest
- [Leetcode] 16. 3Sum Closest
- 【leetcode】16. 3Sum Closest
- [leetcode] 16. 3Sum Closest
- leetcode 16. 3Sum Closest
- leetcode 16. 3Sum Closest
- leetcode 16. 3Sum Closest
- LeetCode - 16. 3Sum Closest
- [LeetCode]16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- LeetCode *** 16. 3Sum Closest
- Leetcode 16. 3Sum Closest
- leetcode 16. 3Sum Closest
- 【LeetCode】16. 3Sum Closest
- leetcode 16. 3Sum Closest
- 【leetcode】16. 3Sum Closest
- leetcode 16. 3Sum Closest
- HDU 5201 The Monkey King(容斥原理)
- eclipse的“Ctrl+Alt+下”快捷键与Win10冲突
- jqGrid|初始化|参数
- Zookeeper系列(一)
- 稀疏编码的一些内容,待整理
- leetcode--16. 3Sum Closest
- 约德尔测试,来自赛码网,初级算法
- Idea
- 计算几何常用算法总结-【数学】
- [PAT乙] 1005. 继续(3n+1)猜想 (25)
- JVM——深入解析之原理和运行机制
- 向小米学习android系统开发
- HDU 4609 3-idiots FFT入门
- java