From b255330c2fb2ecb9fda75fede921303787bc5602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Sat, 15 Dec 2018 21:38:09 +0800 Subject: [PATCH] Create 16. 3Sum Closest.md --- 16. 3Sum Closest.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 16. 3Sum Closest.md diff --git a/16. 3Sum Closest.md b/16. 3Sum Closest.md new file mode 100644 index 0000000..653a559 --- /dev/null +++ b/16. 3Sum Closest.md @@ -0,0 +1,33 @@ +# [16. 3Sum Closest](https://leetcode.com/problems/3sum-closest/) +# 思路 +类似[15. 3Sum](https://leetcode.com/problems/3sum/),先对数组进行排序,外层循环就是遍历一遍数组,内层循环就是用两个指针low和high,与3sum不同的就是 +每次循环要判断记录当前sum和target的差值。 +时间复杂度O(n^2) + +# C++ +``` C++ +class Solution { +public: + int threeSumClosest(vector& nums, int target) { + int len = nums.size(); + long long res=nums[0] + nums[1] + nums[2], min_gap, sum, curr_gap; // 防止溢出所以用long long型 + min_gap = abs(res - target); + sort(nums.begin(), nums.end()); + for(int i = 0; i < len - 2; i++){ + int low = i + 1, high = len - 1; + while(low < high){ + sum = nums[i] + nums[low] + nums[high]; + curr_gap = abs(sum - target); + if(curr_gap < min_gap){ + res = sum; + min_gap = curr_gap; + } + if(target < sum) high--; + else if(target > sum) low++; + else return target; + } // low == high + } + return res; + } +}; +```