题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
来源:LeetCode
解法一
暴力法三次循环,时间复杂度是O(N^3),如何降低复杂度?我们知道,在数组无序的情况下,只能采用这种遍历的方法,没有启发式搜索的信息。所以先排序,之后每个元素i,都依次遍历其[i+1,n]范围内的和,保存最接近target的和,遍历结束后输出即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: int threeSumClosest(vector<int>& nums, int target) { int n = nums.size(); if(n <= 2) return -1; sort(nums.begin(), nums.end()); int min_diff = INT_MAX; int closest_sum; for(int i = 0; i < n; i++) { int left = i+1; int right = n-1; while(left < right) { int sum = nums[i] + nums[left] + nums[right]; int diff = abs(target-sum); if(diff < min_diff) { min_diff = diff; closest_sum = sum; } if(sum == target) { return sum; } else if (sum > target) { --right; } else { ++left; } } } return closest_sum; } };
|