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实现

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