LeetCode – 3Sum Closest (Java)

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

Analysis

This problem is similar to 2 Sum. This kind of problem can be solved by using a similar approach, i.e., two pointers from both left and right.

Java Solution

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

Time Complexity is O(n^2).

Category >> Algorithms  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>

  1. Yuqing Chen on 2014-3-13

    Like your code. Always short and clean, plus easy to understand following a logic. Thumbs up!

  2. Xu ZHANG on 2014-7-25

    Hi, good code!

    But I think add this line of code:

    if (diff == 0) return sum;

    behind the code:

    int diff = Math.abs(sum – target);

    maybe makes the run time shorter?

  3. Arendale on 2014-12-11

    “You may assume that each input would have exactly one solution” Does this mean no duplicates in array?

  4. ryanlr on 2014-12-11

    Absolutely helpful. Added!

  5. ryanlr on 2014-12-11

    Not necessarily. Because different combinations can still have the same sum value. An extreme case: given array {1, 1, 1, 1, 1} and target value 1.

  6. jason on 2015-1-5

    you should return target if diff equals 0

  7. King Fdk on 2015-2-1

    Can this be done using c++ implementation, I’m not able to do it …

  8. theLastUnicorn on 2015-2-9

    Shouldn’t it be
    if(diff == 0) return target;

    instead of 0?

  9. Chris on 2015-5-21

    if(diff == 0) return 0; is wrong, you should return sum instead.

  10. Happyman on 2015-6-20

    public int threeSumCloset(int[]numbers, int target){
    if (numbers == null || numbers.length < 3){
    return Integer.MAX_VALUE;
    }
    int min = Integer.MAX_VALUE / 2;
    int result = Integer.MAX_VALUE / 2;
    Arrays.sort(numbers);
    int length = numbers.length;
    for (int i = 0; i numbers[i – 1]){
    int start = i + 1;
    int end = length – 1;
    while (start Math.abs(sum – target)){
    min = Math.abs(sum – target);
    result = sum;
    }

    start++;
    end–;

    while (start < end && numbers[start] == numbers[start – 1]){
    start++;
    }
    while (start < end && numbers[end] == numbers[end + 1]){
    end–;
    }
    }
    }
    }

    return result;
    }
    }

  11. jason zhang on 2015-6-26

    Can be converted to a binary search problem after sorting.

    The runtime is NlogN(sorting)+logN(binary search)=NlogN

    The code is here: https://github.com/jasonzhang2022/algorithm/blob/master/src/main/java/jason/algorithm/practice/ThreeSumClosest.java

  12. ryanlr on 2015-6-26

    fixed.

  13. Brenda on 2015-10-30

    This doesn’t work for

    Input:[1,1,1,0]
    Target:100

    Output:
    2

    Expected:3

  14. Matias SM on 2016-4-9

    Your solution assumes the 3 values must be next to each other, which is not true. E.g. {1,3,5,7} tgt = 13

  15. Udaydeep Thota on 2016-10-25

    Wouldn’t it be sufficient if the main loop is iterated only till nums.length-2. Thanks.

  16. Piotr Aleksander on 2016-11-8

    Looks so. Can You proof that? Thanks.

Leave a comment

*