Leetcode16.最接近的三数之和

题目

  • 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
  • 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

方法

class Solution {
    public int threeSumClosest(int[] nums, int target) {
    //对nums进行排序
    Arrays.sort(nums);
    //如果小于三个元素,返回空集合
    if(nums.length<3){
    return 0;
    }
    int min =nums[0]+nums[1]+nums[2];
    for(int first =0 ;first<nums.length-1;first++){
    //mid从first的后一个元素开始
    int mid =first+1;
    //last从最后一个元素开始
    int last = nums.length-1;
    while(mid<last){
       //三数之和
      int sum =nums[first]+nums[mid]+nums[last];
      //判断大小
      if(Math.abs(target-sum)<Math.abs(target-min)){
           min= sum;
      }
       if(sum>target){
         last--;
       }else if (sum<target){
           mid++;
       }else {
         return min;
       }
      }
   }
  return min;
}
}
//注意,忽略正数负数带来的分类讨论的这种做法,同时注意代码顺序

思路

  1. 对数组进行排序,固定一个数first,这样就转化为在固定遍历数内找两数midlast看看是三数之和是否满足条件
  2. 设置瞄点为:min =nums[0]+nums[1]+nums[2];用于后面的不断的通过比较缩小与target的距离
  3. 循环遍历first这个数,初始化三个数,first=0;mid =first+1 ,last =nums.length-1;sum =first+mid+last;
  4. 不断更新sum值,通过if abs(target-sum)<abs(target-min)min= sum;
  5. 比较选出来的三个数之和sumtarget的距离,如果小于,则mid++,大于则last--。等于则返回sum;
    4.循环内同时判断 sumtarget 的大小关系,因为数组有序,如果 sum > targetend--,如果 sum < targetstart++,如果 sum == target 则说明距离为 0 直接返回min
  6. 返回min

下一步总结

  • 瞄点的设置可用于需要比较更新同一值时的情况,作为更新值的比较对象而出现。可初始化瞄点为某固定值
发布了18 篇原创文章 · 获赞 0 · 访问量 91

猜你喜欢

转载自blog.csdn.net/qq_22017379/article/details/103914589