【leetcode】3Sum, 3Sum Closest
2016-06-03 20:42
309 查看
这两题一个套路。
先排个序;
外循环遍历数组,选出triplet第一个数;
内循环处理该数之后的子数组,分别从头向后、从尾向前遍历,找到triplet后两个数;
3Sum Closest须另设两个变量,分别保存最接近target的和,及其与target的差距,在内循环中更新;
时间代价O(n*n)。
3Sum
3Sum Closest
Reference:
https://leetcode.com/discuss/23595/share-my-solution-around-50ms-with-explanation-and-comments
先排个序;
外循环遍历数组,选出triplet第一个数;
内循环处理该数之后的子数组,分别从头向后、从尾向前遍历,找到triplet后两个数;
3Sum Closest须另设两个变量,分别保存最接近target的和,及其与target的差距,在内循环中更新;
时间代价O(n*n)。
3Sum
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector< vector<int> > result; sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size(); ++i) { if (nums[i] > 0) break; int front = i + 1; int back = nums.size() - 1; int target = -nums[i]; while (front < back) { int sum = nums[front] + nums[back]; if (sum < target) ++front; if (sum > target) --back; if (sum == target) { vector<int> triplet(3, 0); triplet[0] = nums[i]; triplet[1] = nums[front]; triplet[2] = nums[back]; result.push_back(triplet); while (nums[front] == triplet[1] && front < back) ++front; while (nums[back] == triplet[2] && front < back) --back; } } while (nums[i] == nums[i + 1] && i < nums.size() - 1) ++i; } return result; } };
3Sum Closest
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { int result = 0; if (nums.size() < 3) return 0; sort(nums.begin(), nums.end()); int closetDist = INT_MAX; for (int i = 0; i < nums.size(); ++i) { int left = i + 1; int right = nums.size() - 1; int sum = 0; while (left < right) { sum = nums[i] + nums[left] + nums[right]; if (sum < target) ++left; if (sum > target) --right; if (sum == target) return sum; if (abs(sum - target) < closetDist) { result = sum; closetDist = abs(sum - target); } } } return result; } };
Reference:
https://leetcode.com/discuss/23595/share-my-solution-around-50ms-with-explanation-and-comments
相关文章推荐
- HTML编辑器
- BC zxa and set
- 替换 data.frame 中的特殊的值
- 搭建svnserve并创建提交钩子
- HDU-2002
- spring两种定时任务
- android炫酷的复合文本--SpannableString
- NULL 是什么 && 为什么要使用 strlen(s) + 1
- Linux下面的线程锁,条件变量以及信号量的使用
- 为你的仓库自动创建.gitignore
- 学习SLAM需要哪些预备知识?
- UESTC 490 Swap Game (特殊的求解逆序对数)
- 存储管理的主要方法之连续存储
- startActivityForResult 和 onActivityResult 问题
- 基于Android平台的五子棋小游戏------AI篇
- 模块dll和lib
- 微米系统二次开发记录
- 如何总结和整理学术文献?
- java三种定时任务
- 20. Valid Parentheses