LeetCode - 16. 3Sum Closest

方法一:

这一道题目自然也是有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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值