Leetcode: 3Sum Closest
2014-10-09 04:47
429 查看
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).
这道题跟3Sum很像,区别就是要维护一个最小的diff,求出和目标最近的三个和。brute force时间复杂度为O(n^3),优化的解法是使用排序之后夹逼的方法,总的时间复杂度为O(n^2+nlogn)=(n^2),空间复杂度是O(n)。
第二遍做法:
public class Solution { public int threeSumClosest(int[] num, int target) { if (num == null || num.length < 3) return 0; Arrays.sort(num); int minDiff = num[0] + num[1] + num[2] - target; int diff = 0; for (int i=num.length-1; i>=2; i--) { if (i<num.length-1 && num[i]==num[i+1]) continue; diff = twoSumClosest(num, 0, i-1, target-num[i]); if (Math.abs(diff) < Math.abs(minDiff)) { minDiff = diff; } } return minDiff + target; } public int twoSumClosest(int[] num, int l, int r, int tar) { int minDif = num[l] + num[r] - tar; int dif = 0; while (l < r) { dif = num[l] + num[r] - tar; if (dif == 0) return dif; if (Math.abs(dif) < Math.abs(minDif)) { minDif = dif; } if (dif < 0) { l++; } else { r--; } } return minDif; } }
第一遍做法:
public class Solution { public int threeSumClosest(int[] num, int target) { if (num==null || num.length<3) { return Integer.MIN_VALUE; } int res = num[0] + num[1] + num[2] - target; Arrays.sort(num); for (int i=num.length-1; i>=2; i--) { int cur = twoSum(num, target-num[i], 0, i-1); if (Math.abs(cur) < Math.abs(res)) { res = cur; } } return target+res; } public int twoSum(int[] num, int target, int l, int r) { int closest = num[l] + num[r] - target; while (l < r) { if (num[l] + num[r] == target) { return 0; } int diff = num[l] + num[r] - target; if (Math.abs(diff) < Math.abs(closest)) { closest = diff; } if (num[l] + num[r] > target) { r--; } else { l++; } } return closest; } }
相关文章推荐
- [leetcode]16. 3Sum Closest
- leetcode——16——3Sum Closest
- LeetCode16. 3Sum Closest
- leetcode: 16. 3Sum Closest
- LeetCode --- 16. 3Sum Closest
- LeetCode题解-16-3Sum Closest
- leetcode --3Sum Closest
- LeetCode 16. 3Sum Closest
- [Leetcode]3Sum Closest
- LeetCode - 16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- 和大神们学习每天一题(leetcode)-3Sum Closest
- LeetCode: 3Sum Closest
- LeetCode:3Sum Closest
- [leetcode]16. 3Sum Closest
- [LeetCode] 3Sum Closest
- leetcode16 3Sum Closest
- leetcode 16 -- 3Sum Closest
- LeetCode No.16 3Sum Closest
- [Leetcode] 3Sum Closest