1. 程式人生 > >LeetCode16:3Sum Closest

LeetCode16:3Sum Closest

思路:先將陣列排序,固定第一個數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