16 3sum closest

来源:互联网 发布:大连淘宝运营 编辑:程序博客网 时间:2024/05/21 09:44

思路应该和3sum一样,只是判断的条件不同,这里要求是最接近的,那么就需要维护一个变量,然后通过Math.abs()的大小来判断。。。

下面的代码超时了,看这次能不能写好点:


public class Solution {    public int threeSumClosest(int[] nums, int target) {    //无效输入    if(nums==null || nums.length<3) return Integer.MAX_VALUE;            //两端的极端特例    Arrays.sort(nums);        int minNums=nums[0]+nums[1]+nums[2];        int maxNums=nums[nums.length-3]+nums[nums.length-2]+nums[nums.length-1];        if(target>maxNums) return maxNums;        else if (target<minNums) return minNums;                //正常情况        else{            int result=nums[1]+nums[2]+nums[nums.length-1];            for(int i=0; i<nums.length-2; i++){            int left=i+1;                int right=nums.length-1;                int sum=nums[i]+nums[left]+nums[right];                                //update result because of update of i: i++                if(sum==target) return target;                else result = Math.abs(sum-target)<Math.abs(result-target)?sum:result; // 根据另一个标准 来 二选一;                                while(left<right){                sum=nums[i]+nums[left]+nums[right];                result = Math.abs(sum-target)<Math.abs(result-target)?sum:result;                                 if(sum==target) return target;                else if(sum>target){                        right--;                    }                    else if(sum<target){                        left++;                    }                }            }                        return result;        }    }}

今天写的代码,思路清楚多了,代码也比较简练:


public class Solution {    public int threeSumClosest(int[] nums, int target) {        Arrays.sort(nums);        int len=nums.length;        if(nums[0]+nums[1]+nums[2]>=target) return nums[0]+nums[1]+nums[2];        if(nums[len-1]+nums[len-2]+nums[len-3]<=target) return nums[len-1]+nums[len-2]+nums[len-3];        // 以上的两个判断,可以节约不少时间,从25%到55%,没有上面的判断也work,还是写得不错的,就是在3sum的基础上发生出来的。。                int closest=0;        int diff=Integer.MAX_VALUE;        // 返回值和判断条件是不同的,所以通过closest和diff两个变量来是维护                for(int i=0; i<len-2; i++){            int left=i+1;            int right=len-1;            while(left<right){                int sum = nums[i]+nums[left]+nums[right];                if(sum==target) return sum;                                else if(sum<target){                    closest=(target-sum)<diff?sum:closest;                    diff=(target-sum)<diff?(target-sum):diff; // diff也要更新,这里其实写成一个if((target-sum)<diff){...}也许更清楚                    left++; // 上面两个更新是这道题必须的,这个条件就是根据3sum的基本思路来的,反应了两个极端情况判断的必要性                                    }                else if(sum>target){                    closest=(sum-target)<diff?sum:closest; // 同上                    diff=(sum-target)<diff?(sum-target):diff;                    right--;                }            }            }        return closest;    }}



0 0
原创粉丝点击