当前位置: 首页 > news >正文

算法每日一练 (10)

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (10)
    • 最接近的三数之和
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (10)

最接近的三数之和

题目地址:最接近的三数之和

题目描述

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。

示例 2:

输入:nums = [0,0,0], target = 1
输出:0
解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

解题思路

  • 首先根据题意处理边界条件,当数组长度等于 3 时,不需要任何处理,直接返回和即可。
  • 然后,对目标数组进行排序,根据集合有序的特点再结合双指针 lr,与目标 target 进行比较:
    • 当前三元和小于目标值:移动左指针 l 增加。
    • 当前三元和大于目标值:移动右指针 r 减少。
    • 当前三元和等于目标值:由于题目答案唯一,则直接返回当前三元和即可。
  • 当每次移动指针之后,重新计算当前三元和,然后更新当前已经遍历到元素的三元和 min_sum 和最小三元和与目标 target 的差值 min_sum_df
  • 更新时,按照规则:当差值 min_sum_df 最小时,一定有 min_sumtarget 最为接近
  • 最后返回三元和 min_sum 即可。

解题代码

c/c++
#include <vector>
#include <algorithm>

class Solution
{
public:
    int threeSumClosest(std::vector<int> &nums, int target)
    {
        int sz = nums.size();
        if (sz == 3)
            return nums[0] + nums[1] + nums[2];

        std::sort(nums.begin(), nums.end());

        int min_sum = nums[0] + nums[1] + nums[2];
        int min_sum_df = std::abs(target - min_sum);

        int i = 0;

        while (i < sz - 2)
        {
            int l = i + 1, r = sz - 1;

            while (l < r)
            {
                int sum = nums[i] + nums[l] + nums[r];
                int df = std::abs(target - sum);

                if (df < min_sum_df)
                {
                    min_sum = sum;
                    min_sum_df = df;
                }

                if (sum > target)
                    --r;
                else if (sum < target)
                    ++l;
                else
                    return sum;
            }
            ++i;
        }

        return min_sum;
    }
};
golang
package main

import (
	"math"
	"sort"
)

func threeSumClosest(nums []int, target int) int {

	n := len(nums)

	if len(nums) == 3 {
		return nums[0] + nums[1] + nums[2]
	}

	sort.Ints(nums)

	min_sum := nums[0] + nums[1] + nums[2]
	min_sum_df := math.Abs(float64(target) - float64(min_sum))

	i := 0

	for i < n-2 {
		l, r := i+1, n-1

		for l < r {
			sum := nums[i] + nums[l] + nums[r]
			sum_df := math.Abs(float64(target) - float64(sum))

			if sum_df < min_sum_df {
				min_sum = sum
				min_sum_df = sum_df
			}

			if sum < target {
				l++
			} else if sum > target {
				r--
			} else {
				return sum
			}
		}

		i++
	}

	return min_sum
}
lua
local function threeSumClosest(nums, target)
    local n = #nums
    if n == 3 then
        return nums[1] + nums[2] + nums[3]
    end

    table.sort(nums)

    local min_sum = nums[1] + nums[2] + nums[3];
    local min_sum_df = math.abs(target - min_sum)

    local i = 1

    while i < n - 1 do
        local l, r = i + 1, n

        while l < r do
            local sum = nums[i] + nums[l] + nums[r]
            local sum_df = math.abs(target - sum)

            if sum_df < min_sum_df then
                min_sum = sum
                min_sum_df = sum_df
            end

            if sum < target then
                l = l + 1
            elseif sum > target then
                r = r - 1
            else
                return sum
            end
        end

        i = i + 1
    end

    return min_sum
end

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

相关文章:

  • ai智能语音机器人对我们生活有什么影响
  • OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)
  • 自然语言处理:文本聚类
  • 202250311-WINDOWS本地4G显存Docker运行vLLM
  • 垂起固定翼+多旋翼+自组网:无人机中低空一体化组网技术详解
  • 平时作业
  • 头歌java课程实验(Java面向对象 - 封装、继承和多态的综合练习)
  • C/C++都有哪些开源的Web框架?
  • 【软件】免费的PDF全文翻译软件,能保留公式图表的样式
  • 鲸鱼算法WOA对风电场风电机组一次二次调频参数进行全局最优辨识,二次调频参数辩识matlab/simulink,也可进一步修改成一次调频参数辩识
  • Nginx 限流功能:原理、配置与应用
  • talib编译whl文件通不过问题
  • i18n的替换处理
  • 【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL
  • 智能化水利监管:无人机视频在违章行为识别中的应用
  • 基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档
  • 5秒学会excel中序号列自动增加,不是拖动,图解加说明,解决序号自增多了手拖太累
  • 手写一些常见算法
  • 网络安全演练有哪些形式
  • 前端面试:如何减少项目里面 if-else?
  • “当代阿炳”甘柏林逝世,创办了国内第一所残疾人高等学府
  • 北斗系统全面进入11个国际组织的标准体系
  • 海外市场,押注中国无人驾驶龙头
  • 《五行令》《攻守占》,2个月后国博见
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 普京召开俄乌谈判筹备会议,拉夫罗夫、绍伊古等出席