【每日一题】LeetCode - 最接近的三数之和

LeetCode 的「最接近的三数之和」问题要求我们从给定整数数组中找到三个数的和,使它最接近目标值。适合初学者的原因在于它结合了双指针、排序等基本技巧,为大家理解基本的算法和数据结构提供了一个很好的机会。

如果你不知道什么是双指针可以参考我之前发的博客,或者直接看我数据结构的博客专栏

  • 【数据结构】双指针算法:理论与实战

一、题目介绍

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

返回这三个数的和。

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

这道题与上一题很类似,如果你没看过上一题强烈建议务必去看一下

  • 【每日一题】LeetCode - 三数之和

示例 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

二、解题思路

  1. 排序:首先将数组排序,这有助于后续通过双指针更有效地缩小范围。
  2. 遍历 + 双指针:遍历每个元素作为三元组的第一个元素,然后利用双指针来找到另外两个数。
  3. 求最接近的和:通过计算当前和与目标的差距,不断更新最接近的和。

三、代码实现

以下是代码实现,带有详细注释:

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

四、详细代码解释

  1. 排序:首先对数组进行升序排序,使得我们可以使用双指针的方式进行查找。排序的时间复杂度为 O(n log n)
  2. 遍历数组:代码中我们用一个 for 循环来遍历数组,遍历的目的是固定三元组中的第一个元素 nums[i]
  3. 双指针操作:对于固定的 nums[i],用两个指针 leftright 分别指向剩余部分的首尾,计算三数之和并与目标值比较。
    • 更新最接近的和:如果当前和比记录的最接近值更接近目标值,则更新答案。
    • 移动指针:若当前和小于目标值,说明我们需要一个更大的值来接近目标,因此 left++;反之则 right--

五、时间复杂度和空间复杂度分析

  • 时间复杂度

    • 排序的复杂度为 O(n log n)
    • 外层遍历和内层双指针的复杂度为 O(n^2)
    • 整体时间复杂度为 O(n^2)
  • 空间复杂度

    • 使用了常数级的额外空间来保存变量,因此空间复杂度为 O(1)

在这里插入图片描述

六、其他解法比较

  • 暴力解法:可以使用三重循环来检查每个可能的三数之和,但这种方法的时间复杂度为 O(n^3),在数据量大时效率较低。

暴力解法代码实现

暴力解法通过三重循环来枚举数组中所有可能的三数组合,计算它们的和并与目标值比较,从而找到最接近的和。

class Solution {
public:int threeSumClosest(vector<int>& nums, int target) {int closestSum = 0x7fffffff;int minDiff = 0x7fffffff;for (int i = 0; i < nums.size() - 2; ++i) {for (int j = i + 1; j < nums.size() - 1; ++j) {for (int k = j + 1; k < nums.size(); ++k) {int currentSum = nums[i] + nums[j] + nums[k];int diff = abs(currentSum - target);if (diff < minDiff) {minDiff = diff;closestSum = currentSum;}}}}return closestSum;}
};

暴力解法的分析

  • 时间复杂度:暴力解法的时间复杂度为 O(n^3),因为需要三重循环来枚举所有三数组合。这种复杂度在 n 较大时会导致性能瓶颈。

  • 空间复杂度:该解法仅使用了常数额外空间,因此空间复杂度为 O(1)

  • 双指针优化:相比暴力解法,双指针法在保证准确性的同时减少了计算次数,更加高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4031.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子产品中&#xff0c;控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择&#xff0c;但随着国内半导体技术的进步&…

教育机构如何利用知识中台进行数字教学

在教育行业&#xff0c;数字化转型已成为提升教学质量和效率的关键。知识中台作为一种新兴的技术平台&#xff0c;为教育机构提供了一个集中化、智能化的知识管理和应用解决方案。本文将探讨教育机构如何利用知识中台进行数字教学&#xff0c;以及这一转型带来的优势。 1. 知识…

项目审核系统 ---(连接数据库---项目模拟)

本章主要是查询方法和修改方法 编写查询方法&#xff0c;查询所有项目审核信息并返回查询结果&#xff0c;需实现分页功能&#xff0c;注意必要的异常处理。编写查询方法&#xff0c;根据项目编号查询指定项目的审核信息&#xff0c;注意必要的异常处理。编写修改方法&#xf…

C语言 | Leetcode C语言题解之第524题通过删除字母匹配到字典里最长单词

题目&#xff1a; 题解&#xff1a; char * findLongestWord(char * s, char ** d, int dSize){char *result "";int max -1;for (int i 0; i < dSize; i) {char *p s, *q d[i];int j 0, k 0;while (p[j] ! \0 && q[k] ! \0) {if (p[j] q[k]) {k…

Git详细使用

本地项目托管到码云中教程 1. 使用git init 命令&#xff0c;git init命令用于在目录中创建新的 Git 仓库。 在目录中执行git init就可以创建一个 Git 仓库了。 2. 使用git status命令查看未提交的文件 3. 使用git add . 命令将所有文件添加到暂存区 4. 使用git commit -m &qu…

开源办公软件 ONLYOFFICE 深入探索

文章目录 引言1. ONLYOFFICE 创建的背景1. 1 ONLYOFFICE 项目启动1. 2 ONLYOFFICE 的发展历程 2. 核心功能介绍2. 1 桌面编辑器2. 1. 1 文档2. 1. 2 表格2. 1. 3 幻灯片 2. 2 协作空间2. 3 文档编辑器 - 本地部署版 3. 技术介绍4. 安装5. 优势与挑战6. 个人体验7. 强大但不止于…

Day95 Docker

Docker的使用 1、Docker是什么 docker是一个用来管理镜像的容器 容器(container)&#xff1a;可以装东西 镜像( image )&#xff1a;所谓的镜像&#xff0c;你可以认为就是一个虚拟机 虚拟机&#xff1a;用软件代理硬件来模拟整个计算机的这样一套软件就成为 虚拟机 镜像说白了…

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查

目录 开始前准备的数据库dbblog如下&#xff1a; 第一步&#xff1a;创建项目后下载四个NuGet程序包 第二步&#xff1a;删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.XA…

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

IAPP仿源码大师主界面UI

仿源码大师首页主界面的布局 首页&#xff0c;分类&#xff0c;需求&#xff0c;我的 就只有这几个界面内容而已 资源静态 没有任何动画和功能 纯UI布局 纯UI布局 https://pan.baidu.com/s/1Hc5nWQCZ_ckQlXXV82OYpA?pwd7826 https://caiyun.139.com/m/i?2i2MoYbkdze41 来源…

mmpretrainmmdetection环境配置

mmpretrain&mmdetection环境配置 适用于cuda11.3torch12.1的mmpretrain&mmdetection环境配置&#xff1a; 第一步&#xff1a;根据官网说明&#xff0c;找到对应cuda版本的torch&#xff0c;安装好torch&#xff1a; pip install torch1.12.1cu113 torchvision0.13.…

【数据湖及大数据方案】数据湖建设方案|数据源|数据流|元数据|数据仓库|指标池|数据清洗

建设大数据湖一体化平台旨在应对数据分散、管理混乱及利用低效等挑战。通过集中存储与管理跨平台数据&#xff0c;打破信息孤岛&#xff0c;实现数据资产的高效整合与利用。该平台强化数据标准、质量控制、开发运维及安全保障&#xff0c;提升数据治理成熟度。此外&#xff0c;…

搭建企业私有云 只需一台设备 融合计算、存储与K8s

Infortrend老牌存储厂商推出 KS 企业私有云产品&#xff0c;将计算节点、存储与Kubernetes整合在一套系统中&#xff0c;为企业提供高效稳定的专属本地私有云平台。 KS 同时内置 Kubernetes 平台和虚拟机管理程序&#xff0c;既能运行云原生容器化应用程序&#xff0c;例如大数…

[Redis] Redis主从复制模式

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

计算机毕业设计Hadoop+PySpark深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON&#xff0c;我最终选择了SmartCodable 来替换&#xff0c;原因如下&#xff1a; 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图&#xff1a; 详细的替换教程请前往&#xff1a;使用SmartCodable 平替 HandyJSON …

16、论文阅读:Mamba YOLO:用于目标检测的基于 SSM 的 YOLO

Mamba YOLO: SSMs-Based YOLO For Object Detection 总结前言感受野为什么Transformer 的结构被引入&#xff0c;显著扩展了模型的感受野&#xff1f;状态空间模型SSM 介绍相关工作实时目标检测端到端目标检测器视觉状态空间模型 方法预处理整体架构ODSS BlockLocalSpatial Blo…

微信小程序 uniapp+vue老年人身体监测系统 acyux

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 过此方式促进老年人辅助程序信息流动和数据传输效率&#xff0c;提供一个内容丰富、功能多样、易于操作的老年人辅助程序…

Intellij IDE报错:[Information:java:javacTask:源发行版8需要目标发行版1.8]

Intellij IDE报错:[Information:java:javacTask:源发行版8需要目标发行版1.8] 处理方法 File->Settings->Build,execution,Deployment->Compiler->Java Compiler 进入该目录下&#xff0c;修改Per-module bytecode version&#xff0c;将该项目修改为8 合理的创…