leetCode练习(16)

来源:互联网 发布:淘宝首页模板制作 编辑:程序博客网 时间:2024/04/29 23:21

题目:3Sum Closest

难度:medium

问题描述:

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1.    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

解题思路:

(1)如果是穷举暴力解法,将耗费巨量的时间,我们要想办法增加约束。自然地想到先对数组进行排序,排序后,使用i、j、k三重循环。

同时,使用两个临时变量mint,maxt分别记录下最接近target的值(一个大于,一个小于)。

在第一重i循环时,if(3*nums[i]>maxt)  或者   if(nums[i]+num_2max+num_max<mint),则接下来的i再增加都不会更接近target了,可以直接跳过剩下的i循环。

同理,在第二重j循环时,  if(nums[i]+2*nums[j]>maxt) 或者 if(nums[i]+nums[j]+num_max<mint),则接下来的i再增加都不会更接近target了,也可以直接跳过剩下的i循环。

接着,在第三重循环中,三数相加与mint,maxt比较,进行更新,同时如果和直接为target,则直接返回target即可。

具体代码如下:

public class Solution {    public int threeSumClosest(int[] nums, int target) {        Arrays.sort(nums);if(nums==null||nums.length<3){return 0;}int len=nums.length;int num_max=nums[nums.length-1];int num_2max=nums[nums.length-2];int maxt=Integer.MAX_VALUE;int mint=Integer.MIN_VALUE;int temp;for(int i=0;i<len-2;i++){//System.out.println("i="+i);if(3*nums[i]>maxt)break;if(nums[i]+num_2max+num_max<mint)break;for(int j=i+1;j<len-1;j++){//System.out.println("j="+j);if(nums[i]+2*nums[j]>maxt)break;if(nums[i]+nums[j]+num_max<mint)break;for(int k=j+1;k<len;k++){//System.out.println("k="+k);//System.out.println(nums[i]+":"+nums[j]+":"+nums[k]);temp=nums[i]+nums[j]+nums[k];//System.out.println("temp="+temp);    if(temp<target&&temp>mint){mint=temp;}else if(temp>target&&temp<maxt){maxt=temp;break;}else if(temp==target){return target;}}}}if(((long)maxt-target)>((long)target-mint)){return mint;}else{return maxt;}    }}

(2)在第一重循环后,不适用两重循环,而是将j和k分别在[i+1]和[nums.length-1]处进行夹逼,可以减少大量运算次数。具体代码如下:

public class Solution {    public int threeSumClosest(int[] nums, int target) {        Arrays.sort(nums);if(nums==null||nums.length<3){return 0;}int len=nums.length;int num_max=nums[nums.length-1];int num_2max=nums[nums.length-2];int maxt=Integer.MAX_VALUE;int mint=Integer.MIN_VALUE;int temp;int i=0;while(i<len-2){//System.out.println("-------num[i]="+nums[i]);//System.out.println("max min"+maxt+":"+mint);if(nums[i]+nums[i+1]+nums[i+2]>maxt)break;if(nums[i]+num_2max+num_max<mint)break;int j=i+1;int k=len-1;while(j<k){if(nums[i]+2*nums[j]>maxt)break;if(nums[i]+nums[j]+num_max<mint)break;temp=nums[i]+nums[j]+nums[k];if(temp<target){j++;if(temp>mint){mint=temp;}continue;}else if(temp>target){k--;if(temp<maxt){maxt=temp;}continue;}else if(temp==target){return target;}}i++;}if(((long)maxt-(long)target)>((long)target-(long)mint)){return mint;}else{return maxt;}    }}



0 0
原创粉丝点击