LeetCode

来源:互联网 发布:淘宝网液晶电视机 编辑:程序博客网 时间:2024/04/29 05:22

题目

  输入一个数组和一个目标值target,返回数组中任意3个数的和最接近target的值。

思路

  和 3Sum 类似,每次先确定一个数的值,然后计算选出来的两个数和当前确定的数的和,进行比较,如果和目标值相同,则返回目标值,否则选取更接近的值作为结果值。继续计算,知道找到和目标值相同的值或者计算完毕。

代码

public int threeSumClosest(int[] nums, int target) {    int res = 0;    if (nums == null || nums.length < 3) {        return res;    }    ArrayList<Integer> list = new ArrayList<>();    for (int i : nums) {        list.add(i);    }    Collections.sort(list);    // 初始化res为前三个数之和    res = list.get(0) + list.get(1) + list.get(2);    for (int i = 0 ; i < nums.length - 2 ;) {        // 当前计算的3个数的和        int sum = 0;        // 从i后一个结点开始查找        int left = i + 1;        int right = nums.length - 1;        while (left < right) {            sum = list.get(i) + list.get(left) + list.get(right);            // 如果当前3个数的值更接近target            if (Math.abs(sum - target) < Math.abs(res - target)) {                res = sum;            }            // 如果找到的和目标相等,直接返回            if (sum == target) {                return target;            } else if (sum < target) {                int num = list.get(left);                while (num == list.get(left) && left < right) {                    left++;                }            } else {                int num = list.get(right);                while (num == list.get(right) && right > left) {                    right--;                }            }        }        // 跳过重复的        int num = list.get(i);        // 注意判断顺序,如果颠倒了会抛出异常,应该先判断是否越界        while (i < nums.length && list.get(i) == num) {            i++;        }    }    return res;}
0 0
原创粉丝点击