16.最接近的三數之和(3Sum Closest)
阿新 • • 發佈:2019-01-02
題目描述
給定一個包括 n 個整數的陣列 S,找出 S 中的三個整數使得他們的和與給定的數 target 最接近。返回這三個數的和。
假定每組輸入只存在一個答案。
例如,給定陣列 S = {-1 2 1 -4}, 並且 target = 1.
與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
解題思路
1.檢查陣列的大小是否符合我們的要求;
2.對陣列進行排序,便於後面比較;
3.定義三個指標,分別指向當前位置i,當前位置的下一個位置start以及最後一個位置end;
4.每次計算i,start,end的和,並與target進行比較,並更新最終結果值result;
如果<target,這說明太小了,就讓start往右移;
如果>target,這說明太大了,就讓end往左移;
public int threeSumClosest(int[] num, int target) { if (num.length < 3) return 0; //數字的個數小於3個,直接返回0 Arrays.sort(num); //從小到大排序 int result = num[0] + num[1] + num[num.length - 1]; for (int i = 0; i < num.length - 2; i++) { //三個指標,分別指向當前位置,下一個位置和最後那個位置 int start = i + 1, end = num.length - 1; while (start < end) { int sum = num[i] + num[start] + num[end]; if (sum > target) { //目前的和大於target,必須讓end往左移 end--; } else { //目前的和小於target,必須讓start往右移 start++; } if (Math.abs(sum - target) < Math.abs(result - target)) { result = sum; //更新result } } } return result; }
時間複雜度為O(n*n)