leetcode算法题-数组-最接近的三个数的和

题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 对无序数组进行排序
  • 初始化 closestSum(即和最靠近target的值),默认为数组的前三个数
  • 循环遍历数组,循环条件为i<nums.length-2;
  • 采用双指针算法的思想,定义一个L指针指向当前元素的下一个元素,定义一个R指针指向数组的最后一个元素。
  • 第一步:计算当前循环的三个数的和的最小值min,判定如果min比target大,那就判断min到target的距离和closestSum到target的值谁小,如果Math.abs(min-target)更小,那就将closestSum更新为min,continue继续下次循环。
  • 第二步:计算最大值max,思想同第一步
  • 第三步:如果前两个条件不符合,那就需要以当前元素为基准,L,R指针所指向的元素依次遍历了。也就是经典的双指针算法解题思想了,详细看代码。

代码实现

package com.zcl.数组;

import java.util.Arrays;

/**
 * Author:markusZhang
 * VM Args:
 * Date:Create in 2020/2/1 16:20
 */
public class 最接近的三个数的和 {
    public int threeSumClosest(int[] nums, int target) {
        if(nums==null || nums.length<=2){
            return -1;
        }
        Arrays.sort(nums);
        int closestSum = nums[0]+nums[1]+nums[2];
        for(int i=0;i<nums.length-2;i++){
            int L = i+1;
            int R = nums.length-1;
            int min = nums[i]+nums[L]+nums[L+1];
            if(min>target){
                if(Math.abs(target-closestSum)>Math.abs(target-min)){
                    closestSum = min;
                }
                continue;
            }
            int max = nums[i]+nums[R]+nums[R-1];
            if(max<target){
                if(Math.abs(target-closestSum)>Math.abs(target-max)){
                    closestSum = max;
                }
                continue;
            }
            while(L < R){
                int sum = nums[i]+nums[L]+nums[R];
                if(target==sum){
                    return sum;
                }
                if (Math.abs(target-closestSum)>Math.abs(target-sum)) {
                    closestSum = sum;
                }else if(sum<target){
                    L++;
                }else{
                    R--;
                }
            }
        }
        return closestSum;
    }

    public static void main(String[] args) {
        int a[] = {-1,0,1,1,55};
        System.out.println(new 最接近的三个数的和().threeSumClosest(a,3));
    }
}

猜你喜欢

转载自blog.csdn.net/MarkusZhang/article/details/104135719