題目描述:給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在惟一答案。java
示例說明請見LeetCode官網。數組
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/probl...
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。網絡
首先將數組排序,獲取一個初始的結果difference,而後第一個數字first從第一個數字開始遍歷,第二個數字second和第三個數字third分別從以後的數組中從兩邊向中間遍歷,遍歷過程當中若是與target比difference更接近,則更新difference,直到遍歷完成,返回difference對應的result。指針
說明:解法和 LeetCode-015-三數之和 這個題目的解法相似,可對比參考。code
import java.util.Arrays; public class Solution { /** * 雙指針法 * @param nums * @param target * @return */ public static int threeSumClosest(int[] nums, int target) { if (nums.length == 3) { return nums[0] + nums[1] + nums[2]; } Arrays.sort(nums); int result = nums[0] + nums[1] + nums[2]; int difference = Math.abs(result - target); // 第一個數字 for (int first = 0; first < nums.length - 2; first++) { //過濾掉重複的 if (first > 0 && nums[first] == nums[first - 1]) { continue; } for (int second = first + 1; second < nums.length - 1; second++) { if (second > first + 1 && nums[second] == nums[second - 1]) { // 過濾掉重複的 continue; } int third = nums.length - 1; while (second < third) { // 當3個數之和比當前的result更接近時,更新result if (Math.abs(nums[first] + nums[second] + nums[third] - target) < difference) { result = nums[first] + nums[second] + nums[third]; difference = Math.abs(result - target); } third--; } } } return result; } public static void main(String[] args) { int[] nums = new int[]{0, 1, 2, 3, 4, 5, 6}; System.out.println(threeSumClosest(nums, 2)); } }
【每日寄語】 健康本身就是最大的關愛別人。