Wednesday, January 7, 2015

LeetCode 16: 3Sum Closest

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

public class Solution {
    public int threeSumClosest(int[] num, int target) {
        // Sort array, then two pointers run closer from right and left. 
	int min = Integer.MAX_VALUE; // Minimum absolute difference between sum and target
	int result = 0;
 
	Arrays.sort(num);
 
	for (int i = 0; i < num.length; i++)
	{
	     int left = i + 1;
	     int right = num.length - 1;
			
	     while (left < right)
	     {
		int sum = num[i] + num[left] + num[right];
		int diff = Math.abs(sum - target);
 
                // Find the best result (sum == target), return sum directly.
		if (diff == 0)
		    return sum;
 
		if (diff < min)
		{
		    min = diff;
		    result = sum;
		}
				
		// If sum is small, move left pointer (change to a bigger number)
		if (sum <= target)
		    left++;
		// If sum is big, move right pointer (change to a smaller number)
		else
		    right--;
	     }
	}
 
	return result;     
    }
}

No comments:

Post a Comment