16. 3Sum Closest
給定一個長度大於3的整數陣列和一個數字target,求出最接近target的任意三數之和,
假定測資只存在恰好一解。
Example 1:
Input: nums = [-1,2,1,-4], target = 1
Output: 2
Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
法一 暴力法
思路:
1.老子直接在你面前跑三層loop
Java Code:
class Solution {
public int threeSumClosest(int[] nums, int target) {
int closest = Integer.MAX_VALUE;
int res = 0;
for(int i = 0;i < nums.length;i++)
for(int j = i + 1; j < nums.length; j++)
for(int k = j + 1; k < nums.length; k++) {
int sum = nums[i] + nums[j] + nums[k];
int diff = Math.abs(target - sum);
if(diff < closest) {
res = sum;
closest = diff;
}
}
return res;
}
}
時間複雜度O(n^3) 安心信賴TLE
法二 雙指標
思路:
1.題目要求與target最接近的sum,所以:
A + B + C = sum ==> 趨近於target
我們可以把他移項:
B + C = 趨近於target - A
該問題就會退化為在陣列裡搜尋最接近 target 的 B + C
2.先把整個陣列排序,這樣可以快速的取值且排除掉使用過的組合。
3.遍歷陣列,把nums[i]當作第一個加數A,並從右取最大和最小值當B和C。
sum = A + B + C
4.依據狀況移動指標,分兩case:
若sum > target 表示我們要再拿更小 right