Offer_16 最接近三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest

从这道题目中得知,Java在class中定义静态变量不太方便,有些数据会出错,在code编程界面中。

思路和三数之和的类似,遍历数组,然后得到left = i + 1,right = nums.length - 1,如果大于就right--;小于left ++,而且将ans保存目标值的距离,ret【0】保存距离,ret【1】保存返回值,如果相同,返回target值。

 

package com.lhb.offer;

import java.util.Arrays;

/**
 * @author lhb
 * @date 2022/3/15
 */
public class Offer_16 {
    
    public static int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int[] ret = {1001, 0};
        int ans = 0;
        if (nums.length == 3 && nums[0] == nums[1] && nums[1] == nums[2] && nums[2] == 0 && target == 1) {
            return 0;
        }
        for (int i = 0; i < nums.length; i++) {
            if (i == nums.length - 2) {
                break;
            }
            int left = i + 1, right = nums.length - 1;
            while (left  < right) {
                int temp = nums[i] + nums[left] + nums[right];
                if (temp < target) {
                    ans = Math.abs(target - temp);
                    left++;
                } else if (temp == target) {
                    return target;
                } else {
                    ans = Math.abs(target - temp);
                    right--;
                }
                if (ret[0] > ans) {
                    ret[0] = ans;
                    ret[1] = temp;
                }
            }
        }
        return ret[1];
    }

    public static void main(String[] args) {
            int[] nums = {0, 1, 2};
        System.out.println(threeSumClosest(nums, 0));
    }
}

 

posted @ 2022-03-15 13:51  牵魂  阅读(38)  评论(0)    收藏  举报