LeetCode 16 3Sum Closest
来源:互联网 发布:linux运维之道pdf下载 编辑:程序博客网 时间:2024/06/05 02:35
题意:
给出数组s和目标target,要求从中选出3个数字,使其相加的和最接近target。
思路:
x sum系列的题目,在这里做一个总结。
最经典的情况为2 sum问题,即给出s和target找出s[i] + s[j] = target。
可以使用枚举s[i]判断target - s[i]是否在s中出现且与s[i]不同的O(nlogn)方法,用map或排序后二分查找的方式均可。
也可以使用夹逼搜索的方法,即先将s排序,指针l指向s头,r指向s尾,若s[l] + s[r] < target则++l否则--r。
这种方法的思想类似于枚举s[l],判断target - s[l]是否等于s[r]。如果s[r] > target - s[l],那么r应该指向更小的值,否则说明这个s[l]找不到合适的s[r],这时就枚举下一个s[l]。
排序O(nlogn),夹逼搜索O(n),也就是说2 sum问题可以O(nlogn)解决。
x sum问题可以通过枚举1个数字转化成x-1 sum问题,这样不断转化直到2 sum为止。
本题求closest,那么只需要记录一下当前搜索的数字的和sum与target的差距即可。
代码:
//// Created by 房籽呈 on 2017/1/24.//class Solution {public: int threeSumClosest(vector<int> &nums, int target) { sort(nums.begin(), nums.end()); int ans = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.size(); ++i) { for (int l = i + 1, r = nums.size() - 1; l < r;) { int sum = nums[i] + nums[l] + nums[r]; if (abs(sum - target) < abs(ans - target)) { ans = sum; if (ans == target) { return target; } } if (sum < target) { ++l; } else { --r; } } } return ans; }};
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) 3 Sum Closest
- LeetCode 16 - 3Sum Closest
- leetcode 16 -- 3Sum Closest
- 3Sum Closest - LeetCode 16
- leetcode 16: 3Sum Closest
- Leetcode#16 3Sum Closest
- LeetCode(16) 3Sum Closest
- LeetCode #16 3Sum Closest
- VTK修炼之道26:图像基本操作_三维图像切片提取
- DZ X!插件破解之盗版提示!
- 相似三角形 (sdut oj)
- CODE::BLOCKS 常用快捷键
- windows 安装laravel homestead后,卡在SSH auth method: private key
- LeetCode 16 3Sum Closest
- 【linux】vi的使用
- 在线运行代码
- 【原】小写了一个cnode的小程序
- 构建工具-----Gradle(二)-----myeclipse 10和myeclipse2015安装gradle插件----其他版本的myeclipse类似
- PHP基础之变量传值、常量、魔术常量、变量常规检测
- 2016年,就像打翻了五味瓶
- 网络复习笔记
- 用JavaScript做表单的校验