C++实现LeetCode(16.最近三数之和)

 更新时间:2021年07月13日 09:23:40   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(16.最近三数之和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 16. 3Sum Closest 最近三数之和

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

这道题让我们求最接近给定值的三数之和,是在之前那道 3Sum 的基础上又增加了些许难度,那么这道题让返回这个最接近于给定值的值,即要保证当前三数和跟给定值之间的差的绝对值最小,所以需要定义一个变量 diff 用来记录差的绝对值,然后还是要先将数组排个序,然后开始遍历数组,思路跟那道三数之和很相似,都是先确定一个数,然后用两个指针 left 和 right 来滑动寻找另外两个数,每确定两个数,求出此三数之和,然后算和给定值的差的绝对值存在 newDiff 中,然后和 diff 比较并更新 diff 和结果 closest 即可,代码如下:

解法一:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int closest = nums[0] + nums[1] + nums[2];
        int diff = abs(closest - target);
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size() - 2; ++i) {
            int left = i + 1, right = nums.size() - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                int newDiff = abs(sum - target);
                if (diff > newDiff) {
                    diff = newDiff;
                    closest = sum;
                }
                if (sum < target) ++left;
                else --right;
            }
        }
        return closest;
    }
};

我们还可以稍稍进行一下优化,每次判断一下,当 nums[i]*3 > target 的时候,就可以直接比较 closest 和 nums[i] + nums[i+1] + nums[i+2] 的值,返回较小的那个,因为数组已经排过序了,后面的数字只会越来越大,就不必再往后比较了,参见代码如下:

解法二:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int closest = nums[0] + nums[1] + nums[2];
        int diff = abs(closest - target);
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size() - 2; ++i) {
            if (nums[i] * 3 > target) return min(closest, nums[i] + nums[i + 1] + nums[i + 2]);
            int left = i + 1, right = nums.size() - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                int newDiff = abs(sum - target);
                if (diff > newDiff) {
                    diff = newDiff;
                    closest = sum;
                }
                if (sum < target) ++left;
                else --right;
            }
        }
        return closest;
    }
};

到此这篇关于C++实现LeetCode(16.最近三数之和)的文章就介绍到这了,更多相关C++实现最近三数之和内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现折半查找法(二分法)

    C语言实现折半查找法(二分法)

    这篇文章主要为大家详细介绍了C语言实现折半查找法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Qt实现可以计算大数的简单计算器

    Qt实现可以计算大数的简单计算器

    计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现。本文主要介绍的是基于C++语言,由QT实现的可以计算大数的简单计算器,需要的可以参考一下
    2022-12-12
  • c++ 中__declspec 的用法详解

    c++ 中__declspec 的用法详解

    这篇文章主要介绍了c++ 中__declspec 的用法详解,对初学者有一定的帮助,有需要的可以了解一下。
    2016-11-11
  • 利用C/C++实现较完整贪吃蛇游戏

    利用C/C++实现较完整贪吃蛇游戏

    这篇文章主要为大家详细介绍了利用C/C++实现较完整贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C++中的数组引用和指针引用

    C++中的数组引用和指针引用

    这篇文章主要介绍了C++中的数组引用和指针引用详细的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • C++实现双向链表

    C++实现双向链表

    这篇文章主要为大家详细介绍了C++实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • visual studio 2022中的scanf问题解决

    visual studio 2022中的scanf问题解决

    昨天在使用Visual Studio 2022编写C语言程序时遇到了scanf问题,对于vs的编译器来说scanf是不安全的,编译器通过不了scanf,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2023-12-12
  • LeetCode 单调栈内容小结

    LeetCode 单调栈内容小结

    这篇文章主要介绍了LeetCode 单调栈内容小结,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++深入浅出探索数据结构的原理

    C++深入浅出探索数据结构的原理

    C++的数据结构很多,很复杂,所以本文将通过示例带大家深入了解一下C++中的数据结构与算法。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05
  • C语言中结构体的内存对齐规则讲解

    C语言中结构体的内存对齐规则讲解

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-05-05

最新评论