16. 最接近的三數之和

  • 題目詳述

16. 最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.

 

與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).

 

二.自我探尋

思路 :結合了雙指針在排序數組線性搜索的思路

先排序O(nlogn)

然後循環一遍數組,在循環到某個數的同時,雙指針搜索其後面數組的兩數之和,保存最少與target最小差別的 時間複雜度O(n的平方)

代碼:public int threeSumClosest(int[] nums, int target) {

        int q=0;

       

        for(int t=0;t<nums.length;t++)

        {

          int i=t+1;

          int j=nums.length-1;

          if(t==0)

             q=nums[i]+nums[j]+nums[t];

          while(i<j)

          {

             int twosum=nums[i]+nums[j];

             if(twosum-target+nums[t]==0)

             {

                return twosum+nums[t];

             }

             else if(twosum-target+nums[t]>0)

             {

                j--;

             }

             else

                i++;

             if(Math.abs(twosum-target+nums[t])<Math.abs(q-target))

             {

                q=twosum+nums[t];

             }

          }

   

        }

        return q;

}

評價;

三.網絡學習過程

哭泣..原來是不知道怎麼快時間的算法

看到了9ms的算法 與我思路完全一樣 但快了好多…爲什麼?難道是函數原因?

For循環  循環到倒數第三位即可

代碼(與上面思路完全一樣):

class Solution {

       public int threeSumClosest(int[] nums, int target) {

           int n=nums.length;

           Arrays.sort(nums);

           int ans=Integer.MAX_VALUE,rus=Integer.MAX_VALUE;

           for(int i=0;i<n-2;i++)

           {

                if(i>0&&nums[i]==nums[i-1]) continue;

               int j=i+1;

               int k=n-1;

              

               while(j<k)

               {

                   int sum=nums[i]+nums[j]+nums[k];

                   if(sum==target)

                       return sum;

                   else if(sum>target)

                   {

                       if(sum-target<ans)

                       {

                           ans=sum-target;

                           rus=sum;

                       }

                       k--;

                   }

                   else

                   {

                       if(target-sum<ans)

                       {

                           ans=target-sum;

                           rus=sum;

                       }

                       j++;

                   }

               }

           }return rus;

       }

   }

四.Python實現

 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章