163Sum Closest

来源:互联网 发布:印度英语知乎 编辑:程序博客网 时间:2024/05/21 07:54

题目链接:https://leetcode.com/problems/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).

解题思路:
这题的做法与 3Sum 很类似。依然是转化为 2Sum 的子问题。
不同之处在于,这道题需要维护一个全局最优解,每次循环获得的局部最优解都要和全局最优解进行比较,将最接近的值用于更新全局最优解。
由于这次只要求返回最接近的和,而非三个元素组成的序列,所以将 3Sum 解答的两个函数合并为一。
3Sum 详细解答

public class Solution {    public int threeSumClosest(int[] nums, int target) {        if(nums == null || nums.length < 2)            return Integer.MIN_VALUE;        Arrays.sort(nums);        int closest = nums[0] + nums[1] + nums[2];        for(int i = nums.length - 1; i >= 2; i --) {            int start = 0;            int end = i - 1;            while(start < end) {                int sum = nums[start] + nums[end] + nums[i];                if(Math.abs(sum - target) < Math.abs(closest - target))                    closest = sum;                if(sum < target)                    start ++;                else if(sum > target)                    end --;                else                    return closest;            }        }        return closest;    }}
120 / 120 test cases passed.Status: AcceptedRuntime: 324 ms
0 0