LeetCode - 16. 3Sum Closest

来源:互联网 发布:c语言鸡兔同笼 编辑:程序博客网 时间:2024/05/01 20:24

方法一:

这一道题目自然也是有Brute Froce的解法,一开始思考的方法是通过三重循环和一个HashMap,分别记下来每种组合所对应的sum的大小,然后再从中找到与target最为接近的数返回。这种方法的时间复杂度很高,为O(n^3),再加上HashMap和比较大小所用的时间,在leetcode oj上面几乎肯定要超时,所以详细的代码就不写了

方法二:

思考前面做过的3Sum题目,在这一题目中,我们通过一个外层循环遍历数组中的每个数字,然后在每一个外层循环中设置两个分别指向数组剩余部分的头和尾的指针,然后通过移动两个指针来找到target。这一道题目与3Sum非常相似,我们可以考虑同样的思路,但是注意到这一题目中也有变化,首先,我们并不是去寻找target,而是去寻找与target相差最小的数字,这是一个常见的问题,可以通过设置一个初始值为Integer,MAX_VALUE的标志量,每一个差值与其比较来得到解决,另一个不同则是这里需要的只是一个数字,并不用找出全部的组合,所以在答案中并不需要对数组中元素的重复性进行检验

public class Solution {    public int threeSumClosest(int[] nums, int target) {         //sort array         Arrays.sort(nums);                  int result = 0;         int pfront;         int pback;         //max value          int diff = Integer.MAX_VALUE;                  for(int i = 0; i < nums.length - 2; i++){             //set pointers             pfront = i + 1;             pback = nums.length - 1;                          while(pfront < pback){                 int sum = nums[i] + nums[pfront] + nums[pback];                 if(sum == target){                     return target;                 }else if(Math.abs(target - sum) < diff){                     //update closest value and diff                     diff = Math.abs(target - sum);                     result = sum;                 }                                  //move pointers                 if(sum < target){                     pfront++;                 }else{                     pback--;                 }             }         }         return result;    }}

知识点:

1. Integer.MAX_VALUE, Integer.MIN_VALUE;

2. 找与一个数字相差最近的数字是一类常见的子问题,可以设置一个标志量,将其初始值设置为最大或者最小,然后得到的每一个结果都与其进行比较,根据情况更新

0 0
原创粉丝点击