【力扣算法01】之最接近的三数之和

news2024/9/28 3:29:57

文章目录

  • 前言
  • 问题描述
    • 示例 1
    • 示例 2
    • 提示
  • 解题思路
  • 代码分析
  • 完整代码
  • 运行效果如图
    • 执行示例代码1
    • 执行示例代码2
  • 完结

前言

近期已经将python 的大部分内容讲完了, 接下来的一段时间会着重于算法和面试题相关的内容, 确保学有所用, 同时也为准备进入大厂的童靴们做个铺垫, 记得关注哦!!

问题描述

在这里插入图片描述

给你一个长度为 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

提示

在这里插入图片描述

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

解题思路

在这里插入图片描述

  1. 首先定义了一个名为Solution的类,该类继承自object
  2. 在类中定义了一个名为threeSumClosest的方法,该方法有两个参数:numstarget,分别表示给定的整数数组和目标值。
  3. nums.sort()将数组nums进行排序,这是为了方便后续的双指针遍历。
  4. closest_sum初始化为正无穷大,用于存储最接近目标值的和。
  5. 使用一个循环遍历数组nums,循环变量i的取值范围为从0到数组长度减2。
  6. 在循环中,使用两个指针leftright分别指向当前元素后面的第一个和最后一个元素。
  7. 进入一个内部的循环,当left小于right时进行迭代:
    • 计算当前三个数的和,即current_sum = nums[i] + nums[left] + nums[right]
    • 如果current_sum等于目标值target,则直接返回current_sum
    • 如果当前和与目标值的差的绝对值小于最接近和与目标值的差的绝对值:
      • 更新最接近的和为当前和:closest_sum = current_sum
    • 如果当前和小于目标值,将左指针右移:left += 1
    • 否则,当前和大于目标值,将右指针左移:right -= 1
  8. 当双指针遍历结束后,返回最接近的和closest_sum

通过排序数组和使用双指针的方法,找到一个与目标值最接近的三数之和。通过不断更新最接近的和,并根据当前和与目标值的大小关系移动指针,逐步逼近目标值。经过遍历后得到的最接近的和将作为结果返回。

代码分析

class Solution(object):
    def threeSumClosest(self, nums, target):
        nums.sort()  # 排序数组
        closest_sum = float('inf')  # 初始化最接近的和为正无穷大
  • 这段代码定义了一个名为Solution的类,继承自object。
  • 类中定义了一个名为threeSumClosest的方法,该方法有两个参数:nums和target,分别表示给定的整数数组和目标值。
  • nums.sort()对数组nums进行排序,使得后续的双指针遍历更加方便。
  • closest_sum初始化为正无穷大,用于存储最接近目标值的和。
        for i in range(len(nums) - 2):
            left = i + 1  # 左指针
            right = len(nums) - 1  # 右指针
  • 这段代码使用循环遍历数组nums,循环变量i的取值范围是从0到数组长度减2。
  • 在循环中,定义了两个指针left和right,分别指向当前元素后面的第一个和最后一个元素。
            while left < right:
                current_sum = nums[i] + nums[left] + nums[right]  # 当前三个数的和

                if current_sum == target:  # 如果等于目标值,则直接返回
                    return current_sum

                if abs(current_sum - target) < abs(closest_sum - target):  # 更新最接近的和
                    closest_sum = current_sum

                if current_sum < target:  # 如果当前和小于目标值,左指针右移
                    left += 1
                else:  # 如果当前和大于目标值,右指针左移
                    right -= 1
  • 这段代码进入一个内部的循环,当left小于right时进行迭代。
  • 在内部循环中,计算当前三个数的和current_sum = nums[i] + nums[left] + nums[right]。
  • 如果current_sum等于目标值target,则直接返回current_sum。
  • 如果当前和与目标值的差的绝对值小于closest_sum与目标值的差的绝对值,将最接近的和closest_sum更新为current_sum。
  • 如果当前和小于目标值,将左指针left右移。
  • 如果当前和大于目标值,将右指针right左移。
        return closest_sum
  • 当双指针遍历结束后,返回最接近的和closest_sum。

完整代码

在这里插入图片描述

class Solution(object):
    def threeSumClosest(self, nums, target):
        nums.sort()  # 排序数组
        closest_sum = float('inf')  # 初始化最接近的和为正无穷大

        for i in range(len(nums) - 2):
            left = i + 1  # 左指针
            right = len(nums) - 1  # 右指针

            while left < right:
                current_sum = nums[i] + nums[left] + nums[right]  # 当前三个数的和

                if current_sum == target:  # 如果等于目标值,则直接返回
                    return current_sum

                if abs(current_sum - target) < abs(closest_sum - target):  # 更新最接近的和
                    closest_sum = current_sum

                if current_sum < target:  # 如果当前和小于目标值,左指针右移
                    left += 1
                else:  # 如果当前和大于目标值,右指针左移
                    right -= 1

        return closest_sum

运行效果如图

执行示例代码1

nums = [-1, 2, 1, -4]
target = 1
solution = Solution()
result = solution.threeSumClosest(nums, target)
print(result)   

在这里插入图片描述

执行示例代码2

nums = [0, 0, 0]
target = 1
solution = Solution()
result = solution.threeSumClosest(nums, target)
print(result)

在这里插入图片描述

完结

接下来一段时间会主攻算法面试相关问题, 有兴趣的朋友关注专栏哦!!!

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

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

相关文章

抖音seo源码-源代码开发搭建-开源部署操作日志

一、开发者前言大环境概述 抖音seo源码开发是一项非常重要的技术&#xff0c;在抖音上&#xff0c;有很多视频&#xff0c;如果你想让自己的视频脱颖而出&#xff0c;那么就需要优化自己的seo源码。不过&#xff0c;为了保护用户的隐私&#xff0c;抖音并不公开其seo算法的细节…

Alluxio入门手册

1. 定义 Alluxio&#xff08;之前名为 Tachyon&#xff09;是世界上第一个以内存为中心的虚拟的分布式存储系统。 它统一了数据访问的方式&#xff0c;为上层计算框架和底层存储系统构建了桥梁。应用只需要连接Alluxio即可访问存储在底层任意存储系统中的数据。此外&#xff0c…

太难了,别再为难我们这些测试工程师了好吗?

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

从零开发短视频电商 Jmeter基础介绍和使用心得

文章目录 基本Jmeter主要元件元件执行顺序提取器Json提取器边界值提取器 高级动态参数参数化前后关联设置Jmeter语言为中文环境非GUI模式压测分布式压测监控模板 基本 Jmeter主要元件 1、测试计划&#xff1a;是使用 JMeter 进行测试的起点&#xff0c;它是其它 JMeter测试元…

一、Zabbix介绍及6.0部署

Zabbix 一、Zabbix介绍1、zabbix是什么&#xff1f;2、zabbix的监控原理是什么&#xff1f;3、Zabbix 6.0新特性:4、Zabbix 6.0 功能组件&#xff1a; 二、Zabbix 6.0 部署1、部署 zabbix 服务端2、部署数据库3、编译安装 zabbix Server 服务端4、部署 Web 前端&#xff0c;进行…

Jmeter接口关联(二)【使用jsonpath表达式提取值】与python中使用jsonpath提取值 完成接口关联

文章目录 前言一、jmeter中使用jsonpath的表达式来提取值 1、使用jsonpath表达式匹配date的所有数据2、使用json提取器提取想要拿取的date值二、在Python中使用Jsonpath来完成接口的关联 ​​​​​​​1、jsonpath使用讲解 2、jsonpath在接口关联中使用总结 前言 Jmeter中关…

NFT + JAVA + 可更新合约

前言 合约部署参考&#xff1a;hardhat 合约开发参考&#xff1a;openzeppelin 钱包&#xff1a;metamask 部署链使用的是&#xff1a;sepolia 合约生成Java&#xff1a;solc 合约部署和测试自行处理 1. 合约 合约代码&#xff1a;ZhuZiNFTU.sol // SPDX-License-Iden…

STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057

STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器多个按键蜂鸣器DS18B20温度传感器3个LED灯表示档位加热指…

[SDOI2008] 仪仗队 题解

注&#xff1a;在洛谷同时发布。 题目链接 解题思路 首先观察样例。似乎什么也观察不出来&#xff1f; 那就根据题目描述中所给的图表做。首先找到对角线&#xff0c;将图形沿着对角线一分为二。注意对角线上可以看到一个人&#xff0c;所以答案要加 1 1 1。 其次逐个分析…

-XX:SurvivorRatio

-XX:SurvivorRatio-XXSurvivorRatio eden &#xff1a;from eden &#xff1a;to默认-XXSurvivorRatio8&#xff0c;即 Eden : s0 : s1 8 : 1 : 1&#xff0c;Eden占了年轻代的8/10&#xff0c;不建议修改 case1: -XX:NewRatio4 -XX:SurvivorRatio8 启动参数-Xmx200m -Xms1…

探索Flutter的启动交响曲,详尽指南助力应用启动

Flutter启动流程主要步骤有哪些&#xff1f; 初始化应用程序创建Flutter引擎加载Dart代码构建Widget树创建渲染树更新渲染树呈现界面处理用户输入 Flutter启动需要那些&#xff1f; Dart虚拟机 Dart语言是由Google开发的一种通用编程语言&#xff0c;它可以在不同的平台上运…

基于单片机汽车防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;LCD1602液晶显示当前温度信息和参数等功能&#xff1b;3个LED指示灯表示&#xff1a;震动指示灯、人体感应指示灯、防盗模式开启指示灯&#xff1b;按键用来开启防盗模式&#xff0c;设置温度上下限&#xff1b;开启防盗后检测到…

批量识别表格数据——Python调用百度云API

识别效果展示 原始表格 识别处理的表格&#xff0c;可以看到&#xff0c;效果是非常好的 获取KEY 百度智能云 (baidu.com) 产品——文字识别——通用场景 去领取 通用场景OCR——全部——0元领取 去创建 填应用名称——全选——最下面应用描述——立即创建——返回应用列表 …

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号。因此&#xff0c;抖音SEO矩阵的主要目…

将Notes应用中的PDF附件转为图片

大家好&#xff0c;才是真的好。 好久没有写专门开发方面的知识&#xff0c;主要是因为看的人太少。嗯&#xff0c;当然&#xff0c;这是表面上的&#xff0c;实际上更重要的原因是&#xff0c;写得很麻烦&#xff0c;而且看的人少。 开发要调试&#xff0c;代码要反复测试&a…

Java入门--变量

变量是什么&#xff1f; 变量是用来记住程序要处理的数据的。 变量的定义格式&#xff1f; 数据类型 变量名 数据 注意&#xff1a;这里面的 是赋值的意思&#xff0c;把等号右边的赋值给左边 变量名命名规则&#xff1a; 以字母、下划线、$ 作为首字母由字母、数字、下…

map和set介绍及使用

目录 一、什么是关联式容器 二、set 1.set的介绍 2.set的使用方法 三、mutiset 四、map 1.map简介 2.map的使用 五、multimap 一、什么是关联式容器 在了解map、set之前&#xff0c;你肯定已经使用过vector、list、deque、forward_list(C11)等这些容器&#xff0c;而他…

Jtti:linux如何查看磁盘驱动器列表?

在Linux系统中&#xff0c;你可以使用以下命令之一来查看磁盘驱动器列表&#xff1a; 1.使用 fdisk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表&#xff1a; 这会列出系统中所有的磁盘驱动器及其分区。 2.使用 lsblk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表…

SpringSecurity学习总结

目录 一、简介 二、使用 引入 登录验证流程 完整流程 三、案例(登录验证) 三、设置密码加密和解密方式 三、自定义登录 四、定义JWT认证过滤器 简介 流程 JWT(当前未使用) 定义token过滤 配置过滤器为最前 再次总结流程 五、退出登录 六、一些中间配置 七、网关…

05-流式操作:使用 Flux 和 Mono 构建响应式数据流

1 通过 Flux 对象创建响应式流 基于各种工厂模式的静态创建方法编程的方式动态创建 Flux 相对而言&#xff0c;静态方法在使用上都比较简单&#xff0c;但不如动态方法来得灵活。我们来一起看一下。 2 通过静态方法创建 Flux Reactor 中静态创建 Flux 的方法常见的包括 jus…