题目链接:https://leetcode.com/problems/3sum-closest/
题目:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
思路:
参考http://blog.csdn.net/yeqiuzs/article/details/50272757 解题框架,本题要求跟target距离最近的3元素之和,所以要保存最小距离、最小距离时候的3元素的和。
这里要搞清楚一点,在判断一个已排序数组中是否存在两元素之和 target的时候,要注意可以从两边向中间逼近target,时空复杂度为O(N),而不是两层for循环两个指针指向两个元素判断是否为target,时空复杂度为O(N^2)。如果是无序数组快排后再向中间逼近是O(N logN),也比O(N^2)好。 本题解法的时间复杂度为O(N^2)。
算法:
[java] view
plain copy
- public int threeSumClosest(int[] nums, int target) {
- Arrays.sort(nums);
- int min = Integer.MAX_VALUE,x = target; //min为target和3个元素和的最小距离,x是3元素和
- for (int i1 = 0; i1 < nums.length; i1++) {
- int i2 = i1 + 1;
- int i3 = nums.length - 1;
- while (i2 < i3) {
- if (Math.abs(nums[i2] + nums[i3] + nums[i1] - target) < min) {
- min = Math.abs(nums[i2] + nums[i3] + nums[i1] - target);
- x = nums[i2] + nums[i3] + nums[i1];//保存距离最近的和
- }
- if (nums[i2] + nums[i3] + nums[i1] - target > 0) {
- i3--;
- } else if (nums[i2] + nums[i3] + nums[i1] - target <= 0) {
- i2++;
- }
- }
- }
- return x;
- }
时间: 2024-10-13 02:33:01