【LeetCode】 第16题 最接近的三数之和 threeSumClosest

题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

 分析

方法一:暴力遍历所有可能出现的情况,比较所有情况中结果最小的那个。

方法二:首先排序,将数组中的元素按照从小到大的顺序进行排序,在数组nums中,进行遍历,每遍历一个值利用其下标i,形成一个固定值 nums[i]。建立一个双指针,头指针指向nums[i+1],尾指针指向结尾处。根据 sum = nums[i] + nums[start] + nums[end] 的结果,判断 sum 与目标 target 的距离,如果更近则更新结果 ans,同时需要判断sum与target的大小关系,因为数组是有序的,如果sum > target则end - -,如果sum<target则start++,如果sum == target说明差值为0则直接返回结果。

代码实现

方式一:

public class ThreeSumClosest {
	
    public int threeSumClosest(int[] nums, int target) {
    	int len = nums.length;
    	int min = 10000;
    	int diff =0;
    	int ans = 0;
        for(int i=0; i<len-2; i++) {
        	for(int j=i+1; j<len-1; j++) {
        		for(int m = j+1; m <len; m++) {
        			diff = Math.abs(nums[i]+nums[j]+nums[m]-target);
        			if(min > diff) {
        				min = diff;
        				ans = nums[i]+nums[j]+nums[m];
        			}
        		}
        	}
        }
    	return ans;
    }
	
	public static void main(String[] args) {
		int target = 1;
		int[] nums = {-1,2,1,-4};
		ThreeSumClosest three = new ThreeSumClosest();
		System.out.println(three.threeSumClosest(nums, target));
	}

}

方法二:

import java.util.Arrays;

public class ThreeSumClosest2 {
	
    public int threeSumClosest(int[] nums, int target) {
    	Arrays.sort(nums);  //对数组进行排序
    	int cha = 100000;
    	int sum = 0;
    	int ans = 0;
    	for(int i = 0; i < nums.length; i++) {
    		int m = i+1;
    		int n = nums.length-1;
    		while(m < n) {
        		sum = nums[i]+nums[m]+nums[n];
        		int abs = Math.abs(sum - target);
        		if(cha > abs) {
        			cha = abs;
        			ans = sum;
        		}
        		if(sum > target)
        			n--;
        		if(sum < target)
        			m++;
        		if(sum == target)
        			return sum;
    		}
    	}
    	return ans;
    }
	
	public static void main(String[] args) {
		int target = -100;
		int[] nums = {1,1,1,0};
		ThreeSumClosest2 three = new ThreeSumClosest2();
		System.out.println(three.threeSumClosest(nums, target));
	}
}

 

发布了169 篇原创文章 · 获赞 101 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/zzu_seu/article/details/101481029
今日推荐