leetcode 16. 3Sum Closest
来源:互联网 发布:浙师大行知学院迎新网 编辑:程序博客网 时间:2024/05/01 11:11
题意
找三个数相加最接近的目标的数
题解
将数组排序后,枚举两个不重复的元素A和B,然后用lower_bound函数二分查找第一个大于等于剩余值的数,然后检查这个数和这个数左边的值是否离目标更近。
代码
class Solution {public: int skip(vector<int>& nums, int i) { int size = nums.size(); while (i > 0 && i < size && nums[i] == nums[i - 1]) i++; return i; } int threeSumClosest(vector<int>& nums, int target) { vector<vector<int> > result; int size = nums.size(); const int INF = 1000000; int closest = INF; //the remain value of target bool less_flag = false; sort(nums.begin(), nums.end()); for (int i = 0; i < size; i++) { i = skip(nums, i); // skip repeated element for (int j = i + 1; j < size; j++) { int remain = target - (nums[i] + nums[j]); //int index = -1; vector<int>::iterator pos; if ((pos = lower_bound(nums.begin() + j + 1, nums.end(), remain)) == nums.end()) //compare one element { //temp = temp > 0 ? temp : -temp; if (pos - 1 != nums.begin() + j) { int temp = (*(pos - 1) - remain); if (abs(temp) < closest) { if (temp < 0) { less_flag = true; temp = -temp; } else less_flag = false; closest = min(temp, closest); } } } else // compare two elements { int temp = (*pos - remain); //temp = temp > 0 ? temp : -temp; if (abs(temp) < closest) { if (temp < 0) { less_flag = true; temp = -temp; } else less_flag = false; closest = min(temp, closest); } if (pos - 1 != nums.begin() + j) { temp = (*(pos - 1) - remain); if (abs(temp) < closest) { if (temp < 0) { less_flag = true; temp = -temp; } else less_flag = false; closest = min(temp, closest); } } } while (j > 0 && j < size - 1 && nums[j] == nums[j + 1]) // skip the repeated elements j++; } } if (less_flag) // result < target, return target - closest; else return target + 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
- Android Activity 之 Intent 数据传递学习笔记
- 如何获取两个字符串中两个相同的字符
- Tachyon更名为 Alluxio,并发布1.0版本
- 20160212.CCPP体系详解(0022天)
- 《leetCode》:Binary Tree Level Order Traversal II
- leetcode 16. 3Sum Closest
- 【SSH 1】SSH框架的基本理解
- Copy List with Random Pointer
- 三层总结
- Project Perfect让Swift在服务器端跑起来-Perfect in Visual Studio Code (四)
- cocos create 系列 【一】 初识cocos creator
- elgnairTs'lacsaP.118
- 禁止scrollView滚动
- 图标切换两种状态