算法题:16. 最接近的三数之和(Python Java 详解)

 

 解题思路

Step1:先对数组排序,然后设置3个指针,指针1遍历范围为(0~数组长度减2)。

Step2:指针1位置确定时,指针1后面的数组元素首位各放置一个指针(指针2、指针3)。

Step3:如果三数之和=target,则返回target值;如果三数之和<target,则将指针2往后移动,如果三数之和>target,则将指针3往前移动。

Step4:当指针2指针3重合时,则将指针1往后移动。

Step5:重复 Step2 到 Step4。直到指针1遍历完。

Java代码

import java.util.Arrays;public class ThreeSumClosest {public static void main(String[] args) {Solution sol = new Solution();System.out.println(sol.threeSumClosest(new int[]{-1, 2, 1, -4}, 1));}
}class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n = nums.length;int min_diff = Integer.MAX_VALUE;//当前找到的三数之和与target的最小差值int ans = 0;//最小差值对应的三数之和int cur_sum = 0;int cur_diff = 0;for (int i = 0; i < n - 2; i++) {//优化一:如果有重复元素则跳过if (i > 0 && nums[i] == nums[i - 1]) {continue;}//优化二:如果加上最后面两个数依旧没有target大,则判断一下三数之和之后跳过当前循环cur_sum = nums[i] + nums[n - 2] + nums[n - 1];if (target >= cur_sum) {cur_diff = target - cur_sum;if (cur_diff == 0) {return target;}if (cur_diff < min_diff) {ans = cur_sum;min_diff = cur_diff;}continue;}//优化三:前面3个数的和已经>=target,则判断三数之和之后跳出循环cur_sum = nums[i] + nums[i + 1] + nums[i + 2];if (target <= cur_sum) {cur_diff = cur_sum - target;if (cur_diff == 0) {return target;}if (cur_diff < min_diff) {ans = cur_sum;}break;}int j = i + 1, k = n - 1;while(j < k){cur_sum = nums[i] + nums[j] + nums[k];if (cur_sum == target) {return target;}cur_diff = target - cur_sum;if (cur_sum < target) {if (cur_diff < min_diff) {ans = cur_sum;min_diff = cur_diff;}j++;} else {  //cur_sum > targetcur_diff = -cur_diff;if (cur_diff < min_diff) {ans = cur_sum;min_diff = cur_diff;}k--;}}}return ans;}
}

Python代码

class Solution(object):def threeSumClosest(self, nums, target):nums = sorted(nums)  # or nums.sort()n = len(nums)min_diff = float('inf')ans = 0for i in range(n-2):# 优化一:如果有重复元素则跳过if i > 0 and nums[i] == nums[i-1]:continue# 优化二:如果加上最后面两个数依旧没有target大,则判断一下三数之和之后跳过当前循环cur_sum = nums[i] + nums[n - 2] + nums[n - 1]if target >= cur_sum:cur_diff = target - cur_sumif cur_diff == 0:return targetif cur_diff < min_diff:ans = cur_summin_diff = cur_diffcontinue# 优化三:前面3个数的和已经>=target,则判断三数之和之后跳出循环cur_sum = nums[i] + nums[i + 1] + nums[i + 2]if target <= cur_sum:cur_diff = cur_sum - targetif cur_diff == 0:return targetif cur_diff < min_diff:ans = cur_sumbreakj, k = i + 1, n - 1while j < k:cur_sum = nums[i] + nums[j] + nums[k]if cur_sum == target:return targetcur_diff = target - cur_sumif cur_sum < target:if cur_diff < min_diff:ans = cur_summin_diff = cur_diffj += 1else:cur_diff = -cur_diffif cur_diff < min_diff:ans = cur_summin_diff = cur_diffk -= 1return ansif __name__ == '__main__':sol = Solution()print(sol.threeSumClosest([-1, 2, 1, -4], 1))  # 2

完整题目

16. 最接近的三数之和

给你一个长度为 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
  • -10^4 <= target <= 10^4

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

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

相关文章

项目中用到的git指令合集

目录 前言一、删除分支本地远程 二、不小心删除未合并成功的分支总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 做了一个git的常用指令合集&#xff0c;包含具体场景介绍 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一…

Python笔记——linux/ubuntu下安装mamba,安装bob.learn库

Python笔记——linux/ubuntu下安装mamba&#xff0c;安装bob.learn库 一、安装/卸载anaconda二、安装mamba1. 命令行安装&#xff08;大坑&#xff0c;不推荐&#xff09;2. 命令行下载guihub上的安装包并安装&#xff08;推荐&#xff09;3. 网站下载安装包并安装&#xff08;…

ubuntu外接显示器、不识别笔记本显示器

如题&#xff1a;ubuntu外接显示器、不识别笔记本显示器 双屏幕&#xff0c;笔记本外接显示器HDMI&#xff0c;然后安装Nvidia显卡驱动&#xff0c;之后重启笔记本显示器无法识别&#xff0c;只能使用外接显示器了。 中文网站找遍了都没有解决方案&#xff0c;然后用英文搜索&a…

电路正负反馈,电压电流反馈,串并联反馈详细判别方法

正/负反馈&#xff1a;假设输出升高&#xff0c;转一圈回来仍使其升高就是正反馈&#xff0c;反之就是负反馈。作图法&#xff1a;在RL的信号端画一个向上的小箭头&#xff0c;沿着反馈环路&#xff0c;每经过一个元器件就画一个相应的箭头&#xff0c;一直画到放大器的输出端&…

用C++QT实现一个modbus rtu通讯程序框架

下面是一个简单的Modbus RTU通讯程序框架的示例&#xff0c;使用C和QT来实现&#xff1a; #include <QCoreApplication> #include <QSerialPort> #include <QModbusDataUnit> #include <QModbusRtuSerialMaster>int main(int argc, char *argv[]) {QC…

代理模式(静态代理、JDK代理、CGLIB代理)

简介 代理模式有三种不同的形式&#xff1a;静态代理、动态代理&#xff08;JDK代理、接口代理&#xff09;、CGLIB代理 目标&#xff1a;在不修改目标对象的前提下&#xff0c;对目标对象进行扩展。 静态代理 需要定义接口或父类对象&#xff0c;被代理对象和代理对象通过实…

asp.net docker-compose添加dapr配置

docker-compose.yml添加配置 webapplication1-dapr:image: "daprio/daprd:1.9.6"network_mode: "service:webapplication1"depends_on:- webapplication1 docker-compose.override.yml中添加 dapr-placement:command: ["./placement", "-po…

【数据结构】顺序表的学习

前言:在之前我们学习了C语言的各种各样的语法&#xff0c;因此我们今天开始学习数据结构这一个模块&#xff0c;因此我们就从第一个部分来开始学习"顺序表"。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f…

windows和docker环境下springboot整合gdal3.x

链接: gdal官网地址 gdal gdal的一个用c语言编写的库&#xff0c;用于处理地理信息相关的数据包括转换&#xff0c;识别数据&#xff0c;格式化数据以及解析 同时提供第三方语言的SDK包括python&#xff0c;java上述需要编译后使用 java是需要使用jni接口调用实现方法在wind…

mysql---存储引擎

目录 mysql---存储引擎 功能&#xff1a; mysql的存储引擎分类 MYISAM和INNODB做个对比 MYISAM 在磁盘上有三个文件&#xff1a; MYISAM的特点&#xff1a; 支持的存储格式: INNODB innodb的特点 使用场景&#xff1a; 三个文件&#xff1a; 行锁 表锁 排他锁 …

uniapp原生插件之安卓文件操作原生插件

插件介绍 安卓文件操作原生插件&#xff0c;读写文件&#xff0c;文件下载等&#xff0c;支持读取移动设备路径等外部存储设备路径&#xff0c;如U盘路径 插件地址 安卓文件操作原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓文…

GPT实战系列-ChatGLM3部署CUDA11+1080Ti+显卡24G实战方案

目录 一、ChatGLM3 模型 二、资源需求 三、部署安装 配置环境 安装过程 低成本配置部署方案 四、启动 ChatGLM3 五、功能测试 新鲜出炉&#xff0c;国产 GPT 版本迭代更新啦~清华团队刚刚发布ChatGLM3&#xff0c;恰逢云栖大会前百川也发布Baichuan2-192K&#xff0c;一…

php 接口请求一次,controller调用了两次。

这几天开发一个数据导出功能 由于是数据导出&#xff0c;所以有点慢。然后发现一个问题&#xff0c;前端只请求一次&#xff0c;controller却收到了两次请求。而且第二次请求i必定失败 这就悲催了。脑子懵懵的&#xff01; 由于我这就是个小活儿&#xff0c;于是环境就是使用…

互联网医院|湖南互联网医院|智慧医疗改善就医服务

互联网医院系统&#xff0c;是指利用互联网技术和远程医疗技术&#xff0c;提供在线就诊、咨询、诊断和治疗等医疗服务的一种医疗模式。互联网医院系统实际上与医院的HIS系统很相似&#xff0c;是侧重服务于线上问诊的专业HIS&#xff0c;包含传统HIS的基本模块&#xff0c;如挂…

VS Code 开发 Spring Boot 类型的项目

在VS Code中开发Spring Boot的项目&#xff0c; 可以导入如下的扩展&#xff1a; Spring Boot ToolsSpring InitializrSpring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack&#xff0c; 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot…

【工具】【IDE】Qt Creator社区版

Qt Creator社区版下载地址&#xff1a;https://download.qt.io/archive/qt/ 参考&#xff1a;https://cloud.tencent.com/developer/article/2084698?areaSource102001.8&traceIduMchNghqp8gWPdFHvSOGg MAC安装并配置Qt&#xff08;超级简单版&#xff09; 1.安装brew&…

精品Python手机选购决策数据的分析与可视化大屏购物商城-爬虫

《[含文档PPT源码等]精品基于Python的手机选购决策数据的分析与可视化-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django …

2023-mac rz sz 安装

之前安装过一次&#xff0c;没问题&#xff0c;这次按照之前教程装了就不管上传下载都会卡住&#xff1b; step1: brew install lrzsz step2&#xff1a;在/usr/local/bin 路径下配置两个sh,之前从网上找到的直接用都不对&#xff0c;下面这个是调试过的正式可用的 iterm2…

堆叠注入 [GYCTF2020]Blacklist1

打开题目 判断注入点 输入1&#xff0c;页面回显 输入1 页面报错 输入 1 # 页面正常&#xff0c;说明是单引号的字符型注入 我们输入1; show databases; # 说明有6个数据库 1; show tables; # 说明有三个表 我们直接查看FlagHere的表结构 1;desc FlagHere&#xff1b;# 发…

『PyQt5-基本控件』| 16 什么是屏幕坐标系?

16 什么是屏幕坐标系? 1 什么是屏幕坐标系?2 相关概念3 代码实现4 获取窗口坐标4.1 直接获取4.2 通过坐标系获取4.3 获取Frame坐标1 什么是屏幕坐标系? 2 相关概念 屏幕坐标系,即窗口相对于屏幕的坐标。屏幕左上角坐标称为原点坐标(0,0);窗口的坐标,即窗口的左上角相对…