163Sum Closest

来源:互联网 发布:更换ssh端口 编辑:程序博客网 时间:2024/05/27 20:04

思路类似 3Sum ,先排序,固定一个第一个数调整第二第三个数,

17的解法每次都会进行一轮循环并对是否是closest进行判断, 8ms的解法,在没有=taget的情况之下不断对第二个数第三个数进行循环操作,循环操作结束之后再进行closest的判断 时间节省很多!


17ms解法

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





8ms 解法:


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


0 0
原创粉丝点击