2018.9.30 LeetCode 刷题日记 第16题

Posted tiansiyuan-program

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.9.30 LeetCode 刷题日记 第16题相关的知识,希望对你有一定的参考价值。

第 16 题  最接近目标数的三数之和

 

对一个数组来说,找出其中的三个数,使得三数之和与target最接近,最先想到的是暴力法求解,对i = 0; j = i+ 1; k = j+1;进行三重遍历,记录对target距离的最小值,但是三重循环,时间复杂度0(n3)。

 

改进 : 对寻求目标数来说,三数之和要么比target 大 ,要么比target小,确定寻找方向很重要,可以对数组进行先排序,再找寻正确组合

首先,排序好的数组可以从两侧向中间逼近,最小数和最大数加和,如果和比target大,可以从排序右侧向中间调节,反之从排序向左侧调节,同时注意保证左侧索引值比右侧小,其中若找到和target相等的三数之和,则可以直接返回,因为此时距离为0.

class Solution {
  public int threeSumClosest(int[] nums, int target) {
    int min = Integer.MAX_VALUE;
    int dis = 0;
    Arrays.sort(nums);
    int i = 0;
    int j = 0;
    int k = 0;
    for( i = 0; i < nums.length-2; i++){
      for(j = i+1, k = nums.length-1; j < k; ){
        dis =(nums[i] + nums[j] + nums[k]);
        if(Math.abs(dis-target) < Math.abs(min)){
        min = dis - target;
       }
      if(j < k && dis < target){
          j++;
      }else if(j < k && dis > target){
          k--;
      } else return target;
    }
  }
    return min+target;
  }
}
























以上是关于2018.9.30 LeetCode 刷题日记 第16题的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题日记之柱状图中的最大面积

LeetCode刷题日记之设计循环双端队列

LeetCode刷题日记之前K个高频元素

关关的刷题日记80 – Leetcode 7. Reverse Integer

LeetCode刷题日记之盛最多水的容器

关关的刷题日记48Leetcode 58. Length of Last Word