【leetcode】Array——3Sum Closest(16)

来源:互联网 发布:网络教学系统uml 编辑:程序博客网 时间:2024/05/21 20:16

题目:

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).

思路:暴力遍历,找差值最小的返回。时间复杂度是O(n^3)

代码:略

优化:遍历第一个数,后面两个数用two pointers从两端往中间遍历,时间复杂度O(n^2)

代码:

public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int minDif=Integer.MAX_VALUE;int res=0;for(int i=0;i<nums.length;i++){int start = i+1;int end = nums.length-1;while(start<end){int sum = nums[i]+nums[start]+nums[end];if(sum==target)return target;else if(sum<target){start++;}else{end--;}if(Math.abs(sum-target)<Math.abs(minDif)){minDif=sum-target;res=sum;}}}return res;}
或者如下(下面方法在leetcode runtime比上面短很多,虽然算法原理一样,并不知道为啥~~~)

public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int minDif=Integer.MAX_VALUE;for(int i=0;i<nums.length-2;i++){int curDif=Two(nums,nums[i],i+1,target-nums[i]);if(curDif==0)return target;if(Math.abs(curDif)<Math.abs(minDif)){minDif=curDif;}}return target+minDif;}private int Two(int []nums,int z,int start,int target){int minDif=Integer.MAX_VALUE;int end = nums.length-1;while(start<end){int sum = nums[start]+nums[end];if(sum==target)return 0;else if(sum>target){end--;}else{start++;}if(Math.abs(sum-target)<Math.abs(minDif))minDif=sum-target;}return minDif;}



0 0
原创粉丝点击