LeetCode 最接近的三个数之和

简介: 本题和盛水最多的容器这个题目非常的类似,我就不做过多的铺垫了,我们一起来看题目和我的解题思路吧。

最接近的三个数之和


题目


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


示例:


输入:nums = [-1,2,1,-4], target = 1 输出:2


解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。


提示:


3 <= nums.length <= 10^3 -10^3 <= nums[i] <= 10^3 -10^4 <= target <= 10^4


解题分析


解题思路:


如果采用暴力解题的办法时间复杂度是 O(N * N *N), 这样解题肯定是无法通过的。


对于这样的题目我们可以采用排序 + 双指针的方式来解。


  • 首先我们对于第一个数肯定是需要进行枚举的,为了更好的控制数据的大小,我们需要先对数组进行排序


  • 这样我们就可以通过将求三个数的和,转化为求两个数的和。我们可以采用双指针的方法。进行遍历。这样时间复杂度就可以降低为 O(N*N)。


解题答案


public class ThreeSumClosestTest {
    public static void main(String[] args) {
        ThreeSumClosestTest test = new ThreeSumClosestTest();
        test.threeSumClosest(new int[]{1, 2, 3, 4}, 1);
    }
    public int threeSumClosest(int[] nums, int target) {
        // 数组长度
        int len = nums.length;
        // 排序
        Arrays.sort(nums);
        int result = Integer.MAX_VALUE - target;
        for (int i = 0; i < len - 2; i++) {
            // left, right 表示两端的指针
            int left = i + 1, right = len - 1;
            // 始终保证左边的指针小于右边的指针 
            while (left < right) {
                // 三个数求和
                int sum = nums[i] + nums[left] + nums[right];
                // 情况 1,如果相等直接返回
                if (sum == target) {
                    return sum;
                // 情况 2,如果大于目标值  
                } else if (sum > target) {
                    // 判断是否比 result 更加接近 target 
                    if (Math.abs(sum - target) < Math.abs(result - target)) {
                        // 替换 target
                        result = sum;
                    }
                    // 右指针左移
                    right--;
                } else {
                    if (Math.abs(sum - target) < Math.abs(result - target)) {
                        result = sum;
                    }
                    // 左指针右移
                    left++;
                }
            }
        }
        return result;
    }
}


参考


leetcode-cn.com/problems/3s…


相关文章
|
4月前
|
Java
1657. 确定两个字符串是否接近 --力扣 --JAVA
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a ) 你可以根据需要对任意一个字符串多次使用这两种操作。 给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
29 0
|
9月前
|
存储 算法 Python
【力扣算法01】之最接近的三数之和
【力扣算法01】之最接近的三数之和
55 0
|
10月前
|
测试技术 C++
力扣16-最接近的三数之和&力扣18-四数之和
力扣16-最接近的三数之和&力扣18-四数之和
54 0
|
10月前
|
算法 安全 Swift
LeetCode - #16 最接近的三数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
10月前
leetcode:16.最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
39 0
|
10月前
力扣 -- 16. 最接近的三数之和
力扣 -- 16. 最接近的三数之和
|
11月前
|
算法 C++ Python
每日算法系列【LeetCode 658】找到 K 个最接近的元素
每日算法系列【LeetCode 658】找到 K 个最接近的元素
|
11月前
|
算法 C++ Python
每日算法系列【LeetCode 16】最接近的三数之和
每日算法系列【LeetCode 16】最接近的三数之和
|
测试技术 C++
力扣16-最接近的三数之和&力扣18-四数之和
力扣16-最接近的三数之和&力扣18-四数之和
60 0
力扣16-最接近的三数之和&力扣18-四数之和
每日一题---16. 最接近的三数之和[力扣][Go]
每日一题---16. 最接近的三数之和[力扣][Go]
每日一题---16. 最接近的三数之和[力扣][Go]

热门文章

最新文章