給你一個(gè)長度為n的整數(shù)數(shù)組nums?和 一個(gè)目標(biāo)值target青团。請你從nums 中選出三個(gè)整數(shù),使它們的和與target最接近。
返回這三個(gè)數(shù)的和铅忿。
假定每組輸入只存在恰好一個(gè)解。
示例 1:
輸入:nums = [-1,2,1,-4], target = 1輸出:2解釋:與 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:
輸入:nums = [0,0,0], target = 1輸出:0
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104<= target <= 104
雙指針部分思路:
數(shù)組排序以后,當(dāng)當(dāng)前三個(gè)數(shù)字加起來大于target時(shí)杜秸,右邊的指針右移一位。
當(dāng)當(dāng)前三個(gè)數(shù)字加起來小于target時(shí)润绎,左邊的指針左移一位撬碟。
當(dāng)左指針左移時(shí),三個(gè)數(shù)字之和一定增大莉撇,如果當(dāng)前數(shù)字大于target會導(dǎo)致“距離”越來越遠(yuǎn)呢蛤,
同理右指針右移。
????int?threeSumClosest(vector<int>&?nums,?int?target)?{
????????sort(nums.begin(),nums.end());
????????int?res;
????????bool?first=true;
????????int?p1=0,ncount=nums.size();
????????while?(p1<ncount-2){
????????????if?(p1==0?||?nums[p1]!=nums[p1-1]){
????????????????int?p2=p1+1,p3=ncount-1;
????????????????while?(p2!=p3){
????????????????????int?temp=nums[p1]+nums[p2]+nums[p3];
????????????????????if?(first?||?abs(target-temp)<abs(target-res)){
????????????????????????first=false;
????????????????????????res=temp;
????????????????????}
????????????????????//雙指針變換
????????????????????if?(temp>target)?--p3;
????????????????????else?if(temp<target)?++p2;
????????????????????else?return?temp;
????????????????}
????????????}
????????????++p1;
????????}
????????return?res;
????}