LeetCode16:3Sum Closest

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Somnus_k/article/details/82562635

思路:先将数组排序,固定第一个数k,然后设定两个指针i和j,i从k+1开始,j从nums.length-1开始,每次求nums[i]+nums[j]+nums[k]到target的距离,即绝对值。用一个变量保存距离,一个变量保存三个数的和,每次与之前的距离比较,如果比之前的距离小,则更新三个数的和,同时更新距离,如果nums[i]+nums[j]+nums[k]大于target,则将j左移,如果nums[i]+nums[j]+nums[k]小于target,则将i右移,以此缩小nums[i]+nums[j]+nums[k]与target的距离。

代码:

public class ThreeSumClosest {

	public static void main(String[] args) {
		int[] nums={-1, 2, 1, -4};
		System.out.println(threeSumClosest(nums,1));
	}

	public static int threeSumClosest(int[] nums, int target) {
		Arrays.sort(nums);
		int closest = Integer.MAX_VALUE;
		int abs = Integer.MAX_VALUE;
		for (int i = 0; i < nums.length-2; i++) {
			int left = i+1,right=nums.length-1;
			while(left<right)
			{
				int sum = nums[i]+nums[left]+nums[right];
				if(Math.abs(sum-target)<abs){
					closest = sum;
					abs = Math.abs(sum-target);
				}
				if(sum-target<0)
					left++;
				else if(sum-target>0)
					right--;
				else
					return sum;
				
			}
			
		}
		return closest;
	}
}

输出:2

猜你喜欢

转载自blog.csdn.net/Somnus_k/article/details/82562635
今日推荐