leetcode 16 最接近的三數之和
阿新 • • 發佈:2018-11-21
給定一個包括 n 個整數的陣列 nums
和 一個目標值 target
。找出 nums
中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1. 與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
顯然,時間複雜度為O(n^3)的演算法就沒必要考慮了,筆試或面試的時候如果寫了O(n^3)的應該也過不了吧。
可以先把陣列排序,先取第一個數為nums[i],然後在剩下的數裡選兩個,由於陣列已經排好序,可以用雙指標法,l=i+1;r=nums.length-1;然後判斷nums[i]+nums[l]+nums[r]與target的差值,如果比原來的小則更新。
如果nums[i]+nums[l]+nums[r]<target,則l++;如果nums[i]+nums[l]+nums[r]>target,則r--;
class Solution { public int threeSumClosest(int[] nums, int target) { if(nums.length<3){ return -1; } Arrays.sort(nums); int res=nums[0]+nums[1]+nums[2]; for(int i=0;i<nums.length-1;i++){ int l=i+1; int r=nums.length-1; while(l<r){ int tmp = nums[i]+nums[l]+nums[r]; if(Math.abs(target-tmp)<Math.abs(target-res)){ res=tmp; } if(tmp<target){ l++; } else if(tmp>target){ r--; } else{ return tmp; } } } return res; } }