LeetCode15 三数之和 - “贪心+双指针: 基于”两数之和“的拓展题“

ops/2024/10/24 4:18:10/

Leetcode 15: 三数之和

题目链接

发布在LeetCode上的题解

思路

这道题的思路建立在 167.两数之和 的基础上。先来看看”两数之和“的大概题意:

  • 已知一个非递减的数组,找出满足相加之和等于目标数 target 的两个数,假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。

大致思路如下:

  • 已知数组是非递减的,采用双指针+贪心的方法,首先初始化左指针 l 和右指针 r ,每次判断 numbers[l] + numbers[r]target 的大小关系,如果大于,说明右指针的值大了,则 r-- ;如果小于,说明左指针的值小了,则 l++ ;如果相等,直接 return (因为题干假设有唯一解)

注:l 只能右移,r 只能左移。

”两数之和“的代码如下:

class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:l, r = 0, len(numbers)-1while l < r:if numbers[l] + numbers[r] < target:l += 1elif numbers[l] + numbers[r] > target:r -= 1else:return [l+1, r+1]

理解两数之和的思路之后,三数之和就很好处理了。同样地,我们先将原数组排序,方便后续处理可能存在的重复。同时注意到两数之和用到了一个target 变量,这正好可以用于三数之和的第三个数。

解题过程

  1. 原数组调用 sort() 函数,确保原数组不递减。
  2. i 遍历 nums 数组,nums[i] 作为三个数的第一个数,同时相当于”两数之和“中的 target 变量。
  3. 定义左指针 l=i+1 ,右指针 r=len(nums)-1 ,在这个区间寻找第二、三个数。然后采用和”两数之和“中同样的贪心方法。
  4. 循环到 nums[l]+nums[r]==-nums[i] 时,将这三个数加入 ans 列表。然后收回之前排序的伏笔——跳过重复项。对于第一个数,注意题干要求三个数各不相同,从第1项开始,ii-1 比较是否相等,若相等则 continue;对于第二三个数字,使用 while 循环过滤重复项,首先需要保证 l<r ,然后将l 项和 l+1 项比较是否相等,r 项和 r-1 项比较是否相等,退出 while 循环后, nums[l]!=nums[l+1] ,nums[r]!=nums[r-1] ,因此还需要 l++, r-- 来获取新的数。
  5. 最后返回 ans 列表。

复杂度

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

Code

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:ans = []nums.sort()for i in range(len(nums)-2):if i > 0 and nums[i] == nums[i-1]:continuel, r = i+1, len(nums)-1target = -1 * nums[i]while l < r:if nums[l] + nums[r] < target:l += 1elif nums[l] + nums[r] > target:r -= 1else:ans.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 += 1r -= 1return ans

http://www.ppmy.cn/ops/128002.html

相关文章

【linux】网络基础

1. 网络发展 独立模式->网络互联->局域网LAN->广域网WAN 独立模式: 计算机之间相互独立网络互联: 多台计算机连接在一起, 完成数据共享局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起广域网WAN: 将远隔千里的计算机都连在一起 2. 认识协议 "协议…

【MySQL 保姆级教学】表结构的操作(4)

表结构的操作 1. 定义和语法2. 创建表 CREATE2.1 创建表的本质2.2 表的存储引擎2.3 表的字符集和校验规则2.4 创建表实例 3. 查看表结构 DESC3.1 作用3.2 示例 4. 修改表结构 ALTER4.1 添加列 ADD4.2 修改列 MODIFY4.3 删除列 DROP4.4 更改列名 CHANGE 5. 修改表名 RENAME6. 删…

CRMEB标准版Mysql修改sql_mode

数据库配置 1.宝塔控制面板-软件商店-MySql-设置 2.点击配置修改&#xff0c;查找sql-mode或sql_mode &#xff08;可使用CtrlF快捷查找&#xff09; 3.复制 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 然后替换粘贴&#xff0c;保存 注&#xff1a;MySQL8.0版本的 第三步用…

记录一个容易混淆的 Spring Boot 项目配置文件问题

记录一个容易混淆的 Spring Boot 项目配置文件问题 去年&#xff0c;我遇到了这样一个问题&#xff1a; 在这个例子中&#xff0c;由于密码 password 以 0 开头&#xff0c;当它被 Spring Boot 的 bean 读取时&#xff0c;前导的 0 被自动去掉了。这导致程序无法正确读取密码。…

【Flutter】基础入门:自定义Widget

在 Flutter 开发中&#xff0c;除了使用丰富的内置 Widgets 构建界面外&#xff0c;自定义 Widget 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 StatelessWidget 和 StatefulWidget&#xff0c;以实现复杂的 UI 组件或功能模块。 本教程将通过实例讲…

Git Push(TODO)

最近经常碰到GIT push不上去的问题。到处求人解决也真是尴尬&#xff0c;想自己看看&#xff0c;所以刚刚在github上建了一个仓&#xff0c;试了下。结果如下&#xff1a; 暂时可能还不行&#xff0c;因为数据都是加密的&#xff0c;没法看到具体GIT的交互信息。。。 后面再想办…

CTFHUB技能树之SQL——布尔盲注

开启靶场&#xff0c;打开链接&#xff1a; 输入1&#xff1a; 显示查询成功但没有回显出相关信息&#xff0c;初步判断是布尔盲注入、时间盲注或报错注入 输入1&#xff1a; 还是没有回显 输入1"&#xff1a; 还是没有回显&#xff0c;到这里已经可以确认是布尔盲注了&a…

深入理解 SQL 中的高级数据处理特性:约束、索引和触发器

在 SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;除了基本的查询、插入、更新和删除操作外&#xff0c;还有一些高级的数据处理特性&#xff0c;它们对于确保数据的完整性、提高查询性能以及实现自动化的数据处理起着至关重要的作用。这些特性包括约束、…