leetcode 16 最接近的三数之和(c++和python)

目录

题目描述:

思路:

C++代码:

python代码:


题目描述:

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

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

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

思路:

先从小到大排序,然后定三个索引,i = 0, j = i+1, k = nums.size() -1,以i 为基准,向右移动 j 或者向左移动 k,找到最接近目标的和,如果和小于target, 则为了增大和,向右移动 j, 反之,向左移动 k。

关键点,需要两个变量记录总和、接近程度(可以去掉)。

C++代码:

执行用时:4 ms, 在所有 C++ 提交中击败了98.09%的用户

内存消耗:9.6 MB, 在所有 C++ 提交中击败了49.58%的用户

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int nums_len = nums.size();
        // 排序
        sort(nums.begin(), nums.end());
        
        int closest = nums[0] + nums[1] + nums[2];  // 初始总和
        int diff = abs(closest - target);  // 初始距离
        for (int i = 0; i < nums_len-2; i++)  // 遍历有序数组,将i视为第一个数字,寻找另外两个数字
        {
            int L = i + 1;
            int R = nums_len - 1;
            while (L < R)
            {
                int sum_val = nums[i] + nums[L] + nums[R];
                if (abs(sum_val-target) < diff)  // 如何更接近,则更新总和closest和距离diff
                {
                    closest = sum_val;
                    diff = abs(sum_val-target);
                }

                if (sum_val < target) L++;  // 去下一个位置,如果总和小了,移动左边。
                else if (sum_val > target) R--;
                else return target;
            }
        }
        return closest;

    }
};

python代码:

执行用时:48 ms, 在所有 Python 提交中击败了85.54%的用户

内存消耗:13.2 MB, 在所有 Python 提交中击败了12.45%的用户

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # 排序
        nums.sort()

        # 赋值
        closest_sum = nums[0] + nums[1] + nums[2]
        diff = abs(closest_sum - target)

        for i in range(len(nums)-2):
            L = i + 1
            R = len(nums) - 1
            while L < R:
                sum_val = nums[i] + nums[L] + nums[R]
                if abs(sum_val - target) < diff:  # 是否需要更新closest_sum和diff
                    closest_sum = sum_val
                    diff = abs(sum_val - target) 
                # 下一个位置
                if sum_val < target: L = L + 1
                elif sum_val > target: R = R - 1
                else: return target
        return closest_sum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值