力扣16 最接近三数之和

devtools/2024/9/23 18:50:01/

描述

力扣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
解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。

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

方法:遍历+双指针

思路:
我们先将数组进行排序,然后遍历,每次遍历先确定一个数字,再通过左右指针确定第二位和第三位。详细解释请看下文代码和注释
具体实现及注释:

class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int length = nums.length;//这个值为最接近target的三数和,初始化为100000;int close  = 100000;//遍历,因为后面至少要留两个数字,所以到length-2即可。for (int i = 0; i < length-2; i++) {int head = nums[i];if (i != 0 && nums[i] == nums[i-1]) continue;//这块代码是速度优化,可以先忽略此部分,先把代码整体逻辑实现理清楚,再来看如何进行优化让代码更快//因为数组是从小到大排序,如果nums[i] + nums[i+1] + nums[i+2]都比target大了,那么后面的元素只会更大,不符合题意,直接和close比较后break打断循环//nums[i] + nums[length-1] + nums[length-2]是选定i的情况下最大和,如果这都比target要小,其余的更小,不符合题意,所以直接continue进入下一次循环/*int sum0 = nums[i] + nums[i+1] + nums[i+2];if (sum0 > target) {if (Math.abs(close - target) > Math.abs(sum0 - target)) close = sum0;break;}int sum1 =  nums[i] + nums[length-1] + nums[length-2];if (sum1 < target) {if (Math.abs(close - target) > Math.abs(sum1 - target)) close = sum1;continue;}*///左指针指向第一个数字的后一位,右指针指向最后一个数字int left = i + 1;int right = length - 1;//当三数和sum大于target,说明sum需要减小,所以将右指针左移一位,反之则左指针右移一位while (left < right) {int sum = head + nums[left] + nums[right];if (sum == target) return sum;else if (sum > target) right = nextRight(left, right, nums);else left = nextLeft(left, right, nums);if (Math.abs(close - target) > Math.abs(sum - target)) close = sum;}}return close;}//这个函数是在right左移时过滤掉与当前数值相等的情况,如数组[2, 3, 3, 3, 3],若right=4指向最后一个3,则将前面的3过滤掉,使其等于0指向2.int nextRight(int left, int right, int[]nums) {while (right > left && nums[right] == nums[right-1]) right--;return right - 1;}//与上文同理int nextLeft(int left, int right, int[]nums) {while (right > left && nums[left] == nums[left+1]) left++;return left + 1;}
}

http://www.ppmy.cn/devtools/116127.html

相关文章

docker基础学习

基础命令 1、验证安装是否成功docker versiondocker info 2、启动docker服务sudo service docker start或者sudo systemctl start docker 3、列出本机所有的image文件docker image ls 4、删除image文件docker image rm [imageName] 5、从仓库抓取image到本地docker image pull…

Docker笔记-Docker Dockerfile

Docker笔记-Docker Dockerfile Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 这里讲解如何运行 Dockerfile 文件来定制一个镜像。 DockerFile构建过程解析&#xff1a; 1、每条保留字指令都必须为大写字母且后面要…

危化品经营单位(生产管理人员)考试题库及答案

危化品经营单位&#xff08;生产管理人员&#xff09;考试题库及答案 31.应急救援预案要有实用性、要根据&#xff08; &#xff09;的实际条件制订,使预案便于操作。 A.本单位 B.周边单位 C.其它单位 答案:A 32.应急救援预案要定期演习和复查,要根据&#xff08; &#…

Nginx:高性能Web服务器与反向代理的深度解析

Nginx:高性能Web服务器与反向代理的深度解析 引言 在当今的互联网架构中,Nginx以其轻量级、高并发、易扩展的特性,成为了众多企业和开发者首选的Web服务器和反向代理服务器。Nginx不仅能够有效提升网站的性能和安全性,还能通过负载均衡和缓存等功能,进一步优化用户体验。…

深度学习与大模型第5课:利用 NLTK 中的朴素贝叶斯工具解决实际问题:垃圾邮件过滤

文章目录 利用 NLTK 中的朴素贝叶斯工具解决实际问题&#xff1a;垃圾邮件过滤什么是朴素贝叶斯分类器&#xff1f; 案例&#xff1a;垃圾邮件过滤1. 安装和导入NLTK库2. 准备数据3. 特征提取4. 训练朴素贝叶斯分类器5. 测试分类器6. 评估分类器7. 优化与改进总结 利用 NLTK 中…

从入门到精通:计算机视觉学习路线与实战项目推荐

全面解析计算机视觉的学习路径&#xff0c;深入探讨关键技术与实战项目&#xff0c;助您快速掌握核心技能 引言 随着人工智能的飞速发展&#xff0c;计算机视觉已成为AI领域中最具潜力和应用价值的分支之一。从自动驾驶到医疗影像分析&#xff0c;计算机视觉技术正在改变我们的…

springboot结合p6spy进行SQL监控

1.学习p6spy的相关链接 英文文档&#xff1a;Integrating P6Spy — p6spy 3.9.2-SNAPSHOT documentationhttps://p6spy.readthedocs.io/en/latest/integration.html github链接&#xff1a;GitHub - p6spy/p6spy: P6Spy is a framework that enables database data to be sea…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…