力扣大厂热门面试算法题 15-17

        15. 三数之和,16. 最接近的三数之和,17. 电话号码的字母组合,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.11 可通过leetcode所有测试用例。

目录

15. 三数之和

解题思路

完整代码

Java

Python

​编辑

16. 最接近的三数之和

解题思路

完整代码

Java

Python

17. 电话号码的字母组合

解题思路

完整代码

Java

Python


15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
 

解题思路

        为了找到所有和为0且不重复的三元组,我们可以使用双指针法。这个方法涉及到先对数组进行排序,然后遍历数组,对于每个元素,使用两个指针分别指向元素之后的开始位置和数组的末尾,向中间移动两个指针来找到和为0的三元组。这里有几个关键点需要注意:

  1. 排序:先对数组进行排序,这样可以方便地跳过重复的元素。
  2. 遍历:从数组的开始遍历到倒数第三个元素(因为我们需要的是三元组)。
  3. 双指针:对于每个遍历到的元素,将一个指针指向遍历元素的下一个位置,另一个指针指向数组的末尾。根据这两个指针指向的元素之和与当前遍历到的元素之和来移动指针。
  4. 跳过重复元素:在遍历过程中,如果遇到重复的元素,需要跳过,以避免重复的三元组。

完整代码

Java
public class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);  // 排序List<List<Integer>> res = new ArrayList<>();for (int i = 0; i < nums.length - 2; i++) {  // 遍历到倒数第三个元素if (i > 0 && nums[i] == nums[i - 1]) {  // 跳过重复元素continue;}int l = i + 1, r = nums.length - 1;while (l < r) {int sum = nums[i] + nums[l] + nums[r];if (sum < 0) {l++;} else if (sum > 0) {r--;} else {res.add(Arrays.asList(nums[i], nums[l], nums[r]));while (l < r && nums[l] == nums[l + 1]) l++;  // 跳过重复元素while (l < r && nums[r] == nums[r - 1]) r--;  // 跳过重复元素l++;r--;}}}return res;}
}
Python
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()  # 排序result = []for i in range(len(nums)-2):  # 遍历到倒数第三个元素if i > 0 and nums[i] == nums[i-1]:  # 跳过重复元素continuel, r = i+1, len(nums)-1  # 双指针while l < r:s = nums[i] + nums[l] + nums[r]if s < 0:l += 1elif s > 0:r -= 1else:result.append([nums[i], nums[l], nums[r]])while l < r and nums[l] == nums[l+1]:  # 跳过重复元素l += 1while l < r and nums[r] == nums[r-1]:  # 跳过重复元素r -= 1l += 1; r -= 1return result

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

解题思路

        为了找到和与目标值 target 最接近的三个整数的和,我们可以使用一种类似于解决“三数之和”问题的方法,即使用双指针法。基本思路如下:

  1. 排序:首先,对数组 nums 进行排序,这有助于使用双指针法。

  2. 初始化最接近的和:用一个变量记录当前找到的与 target 最接近的和,初始时可以设为第一个元素、第二个元素和最后一个元素的和,或者设置为一个较大的数。

  3. 遍历:遍历数组,对于每个元素 nums[i],使用两个指针分别指向 i 之后的元素和数组的最后一个元素。基于当前三元组的和与 target 的差距,移动指针。

  4. 移动双指针:如果三元组的和大于 target,为了使和更接近 target,应该减小和,因此将右指针左移。如果三元组的和小于 target,为了使和更接近 target,应该增加和,因此将左指针右移。

  5. 更新最接近的和:在每一步中,如果找到了更接近 target 的和,则更新记录的最接近的和。

  6. 返回结果:遍历结束后,记录的最接近的和即为所求。

完整代码

Java
public class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int closestSum = nums[0] + nums[1] + nums[nums.length - 1];  // 初始化最接近的和for (int i = 0; i < nums.length - 2; i++) {int l = i + 1, r = nums.length - 1;while (l < r) {int currentSum = nums[i] + nums[l] + nums[r];if (currentSum == target) {  // 如果等于target,直接返回return currentSum;}// 更新最接近的和if (Math.abs(currentSum - target) < Math.abs(closestSum - target)) {closestSum = currentSum;}// 根据和与target的比较,移动双指针if (currentSum < target) {l++;} else {r--;}}}return closestSum;}
}
Python
class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()closest_sum = sum(nums[:3])  # 初始化最接近的和for i in range(len(nums) - 2):l, r = i + 1, len(nums) - 1while l < r:current_sum = nums[i] + nums[l] + nums[r]if current_sum == target:  # 如果等于target,直接返回return current_sum# 更新最接近的和if abs(current_sum - target) < abs(closest_sum - target):closest_sum = current_sum# 根据和与target的比较,移动双指针if current_sum < target:l += 1else:r -= 1return closest_sum

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解题思路

        可以使用回溯法。回溯法是一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即回溯并尝试另一个可能的解。

        具体到这个问题,可以将每个数字对应到其可以代表的所有字母,然后通过回溯遍历这些字母的所有可能组合。

  1. 创建一个映射表,将每个数字映射到相应的字母。
  2. 创建一个函数来实现回溯机制,该函数将接受当前组合的字符串和接下来处理的数字字符串。
  3. 从输入字符串的第一个数字开始,将其映射到对应的所有字母,并对每个字母,添加到当前的组合字符串中,并进行下一轮回溯,即再处理下一个数字。
  4. 如果数字字符串为空,表示所有的数字都已处理完毕,此时的组合字符串为一个完整的解,将其添加到答案列表中。
  5. 重复步骤3和4,直到遍历完所有的数字,找出所有可能的字母组合。

完整代码

Java
public class Solution {public List<String> letterCombinations(String digits) {List<String> combinations = new ArrayList<>();if (digits == null || digits.length() == 0) {return combinations;}String[] phoneMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};backtrack(combinations, phoneMap, digits, 0, new StringBuilder());return combinations;}public void backtrack(List<String> combinations, String[] phoneMap, String digits, int index, StringBuilder path) {if (index == digits.length()) {combinations.add(path.toString());return;}String possibleLetters = phoneMap[digits.charAt(index) - '0'];for (char letter : possibleLetters.toCharArray()) {path.append(letter);backtrack(combinations, phoneMap, digits, index + 1, path);path.deleteCharAt(path.length() - 1); // 回溯}}
}
Python
class Solution:def letterCombinations(self, digits: str) -> List[str]:if not digits:return []phoneMap = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl","6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}def backtrack(index, path):# 如果路径长度与输入数字长度相同,将其添加到结果中if len(path) == len(digits):combinations.append("".join(path))return# 获取当前数字对应的所有可能的字母possible_letters = phoneMap[digits[index]]for letter in possible_letters:# 添加当前字母到路径中,并进入下一层回溯path.append(letter)backtrack(index + 1, path)path.pop()  # 回溯,移除路径最后一个字母combinations = []backtrack(0, [])return combinations

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

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

相关文章

Ubuntu 24.04 抢先体验换国内源 清华源 阿里源 中科大源 163源

Update 240307:Ubuntu 24.04 LTS 进入功能冻结期 预计4月25日正式发布。 Ubuntu22.04换源 Ubuntu 24.04重要升级daily版本下载换源步骤 (阿里源)清华源中科大源网易163源 Ubuntu 24.04 LTS&#xff0c;代号 「Noble Numbat」&#xff0c;即将与我们见面&#xff01; Canonica…

vue provide 与 inject使用

在vue项目中&#xff0c;如果遇到跨组件多层次传值的话&#xff0c;一般会用到vuex&#xff0c;或者其他第三方共享状态管理模式&#xff0c;如pinia等&#xff0c;但是对于父组件与多层次孙子组件时&#xff0c;建议使用provide 与 inject&#xff0c;与之其他方式相比&#x…

如何使用Everything+cpolar实现公网远程搜索下载内网储存文件资料

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

高分1、2号卫星原始遥感影像数据

高分一号 高分一号卫高分一号卫星是中国高分辨率对地观测系统的首发星&#xff0c;突破了高空间分辨率、多光谱与宽覆盖相结合的光学遥感等关键技术&#xff0c;设计寿命5至8年。 高分辨率对地观测系统工程是《国家中长期科学和技术发展规划纲要(2006&#xff5e;2020年)》确定…

StarRocks实战——欢聚集团极速的数据分析能力

目录 一、大数据平台架构 二、OLAP选型及改进 三、StarRocks 经验沉淀 3.1 资源隔离&#xff0c;助力业务推广 3.1.1 面临的挑战 3.1.2 整体效果 3.2 稳定优先&#xff0c;监控先行&#xff0c;优化运维 3.3降低门槛&#xff0c;不折腾用户 3.3.1 与现有的平台做打通 …

分库分表浅析原理

数据库存放数据大了&#xff0c;查询等操作就会存在瓶颈&#xff0c;怎么办&#xff1f; 1. 如果是单张表数据大了&#xff0c;可以在原有库上新建几张表table_0、table_1、table_2、.....table_n 写程序对数据进行分表&#xff1a; --这里提供一种一种分表策略,这里只需维护…

容器安全是什么?

容器安全定义 容器安全是指保护容器的完整性。这包括从其保管的应用到其所依赖的基础架构等全部内容。容器安全需要完整且持续。通常而言&#xff0c;企业拥有持续的容器安全涵盖两方面&#xff1a; 保护容器流水线和应用保护容器部署环境和基础架构 如何将安全内置于容器流…

Java开发从入门到精通(一):Java的基础语法项目案例

Java大数据开发和安全开发 Java 案例练习案例一:买飞机票案例二:开发验证码案例三:评委打分案例四:数字加密案例五:数组拷贝案例六: 抢红包案例七:找素数案例八:模拟双色球[拓展案例] Java 案例练习 案例一:买飞机票 分析: 方法是需要接收数据?需要接收机票原价、当前月份、舱…

新手如何快速上手学习单片机?

读者朋友能容我&#xff0c;不使博文负真心 新开专栏&#xff0c;期待与诸君共享精彩 个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器&#xff0c;广泛应用于各种电子设备和嵌入式系统中。在这…

#QT(本地音乐播放器)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;之前做的音乐播放器只做了一个界面&#xff0c;是因为跟的课程发现到后面需要付费&#xff0c;并且WINGW6.2.0运行QMediaPlayer时无法运行&#xff0c;会崩溃&#xff0c;现在退一步用WINGW5.12.2做一个本地音乐播放器 3.记录&am…

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数&#xff08;命令行、配件文件&#xff09;1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动&#xff0c;以及配置密码文件 1.2 查询表的相关参数&#xff0c;以及表空间管理 2、Mysql高级优化&#xff08;SQL&…

Android中显式Intent和隐式Intent的区别

1、intent的中文名 称是意图&#xff0c;Intent是各个组件之间信息沟通的桥梁&#xff0c; 既能在Activity之间沟通&#xff0c;又能在Activity与Service之间沟通&#xff0c;也能在Activity与Broadcast之间沟通 **intent组成元素的列表说明**2、显式Intent&#xff0c;直接指定…

编译支持国密的抓包工具 WireShark

目录 前言WireShark支持国密的 WireShark小结前言 在上一篇文章支持国密的 Web 服务器中,我们搭建了支持国密的 Web 服务器,但是,我们使用 360 安全浏览器去访问,却出现了错误: 是我们的 Web 服务器没有配置好?在这里插入图片描述还是 360 安全浏览器不支持国密?还是两…

C++面试宝典一部分

今天整理书籍资料时&#xff0c;发现多年前打印的面试资料&#xff0c;拍照分享给大家。

基于网络爬虫的购物平台价格监测系统的设计与实现

通过对网络爬虫的购物平台价格监测系统的业务流程进行梳理可知&#xff0c;网络爬虫的购物平台价格监测系统主要由前台买家模块、后台卖家模块以及管理员模块构成。前台功能包含登录功能、注册功能、系统首页功能、唯品会商品详情浏览、唯品会商品收藏、唯品会商品点赞、唯品会…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

ZYNQ实验--PDM波形生成

一、PDM简介 将信号的振幅变化按比例地变换成脉冲宽度的变化&#xff0c;得到脉冲宽度调制(PDM)。详细的原理理论可以参考该文&#xff1a;文献阅读–Pulse-Width Modulation&#xff0c;本文主要介绍PDM的FPGA实现&#xff0c;PDM的生成方式很多具体形式根据需求会有所不同 二…

【Stable Diffusion】入门:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

中国广电的独特优势:与三大运营商相比的亮点

2023年&#xff0c;中国广电正式上市了&#xff0c;发出了第一批号段192的号码&#xff0c;然而值得大家了解的是&#xff1a;在中国的通信市场中&#xff0c;中国移动、中国联通和中国电信长期以来占据主导地位。然而&#xff0c;随着中国广电的加入&#xff0c;市场格局正在发…

了解转义字符

了解转义字符 也许在前面的代码中你看到 \n , \0 很纳闷是啥。其实在字符中有⼀组特殊的字符是转义字符&#xff0c;转义字符顾名思义&#xff1a;转变原来的意思的字符。 比如&#xff1a;我们有字符 n &#xff0c;在字符串中打印的时候自然能打印出这个字符&#xff0c;如下…