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

devtools/2024/10/24 3:26:29/

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/devtools/128345.html

相关文章

Vue项目中实现拖拽上传附件:原生JS与Element UI组件方法对比

在现代化的Web应用中&#xff0c;文件上传是一个基本功能。随着技术的发展&#xff0c;拖拽上传已经成为提升用户体验的一个重要特性。在Vue项目中&#xff0c;我们可以通过原生JavaScript或使用Element UI组件来实现这一功能。下面我们将分别介绍这两种方法&#xff0c;并对比…

小新学习K8s第一天之K8s基础概念

目录 一、Kubernetes&#xff08;K8s&#xff09;概述 1.1、什么是K8s 1.2、K8s的作用 1.3、K8s的功能 二、K8s的特性 2.1、弹性伸缩 2.2、自我修复 2.3、服务发现和负载均衡 2.4、自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 2.5、集中化配置管理和密钥…

Linux学习_1

第0章Linux基础入门 主要包括什么是计算机&#xff0c;操作系统简介&#xff0c;Linux入门&#xff0c;常见Linux版本介绍&#xff0c;Linux认证&#xff0c;搭建Linux学习环境&#xff0c;这里主要写一下有关Linux操作的部分 搭建Linux学习环境 安装Linux操作系统&#xff08…

测网速小程序,纯前端

搜索&#xff1a;证寸照制作 源码介绍: 测网速小程序源码&#xff0c;是一款纯前端无需服务器的测网速小程序&#xff0c;依赖百度开发者中心js接口&#xff0c;真正的永久使用的小工具源码&#xff0c;很实用&#xff0c;可以单独运行&#xff0c;测网速很流畅~ 合法域名: ht…

基于深度学习的生物启发的学习系统

基于深度学习的生物启发学习系统&#xff08;Biologically Inspired Learning Systems&#xff09;旨在借鉴生物大脑的结构和学习机制&#xff0c;设计出更高效、更灵活的人工智能系统。这类系统融合了生物神经科学的研究成果&#xff0c;通过模仿大脑中的学习模式、记忆过程和…

【数据结构】滑动窗口算法详解:高效解决子串问题

滑动窗口&#xff08;Sliding Window&#xff09;是一种常用于处理数组或字符串中子序列问题的算法技巧。它通过维护一个窗口来限制待处理的数据范围&#xff0c;从而高效地解决问题&#xff0c;避免重复计算。它的时间复杂度通常为 O(N)&#xff0c;相较于暴力破解&#xff08…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

HCIP-HarmonyOS Application Developer 习题(十)

1、HarmonyOS设备A上的应用通过调用分布式任务调度的能力continuesbility&#xff0c;向设备B的应用发起跨端迁移&#xff0c;此过程属于跨端迁移中的哪个流程? A、流转准备 B、流转进行 C、流转结束 D、流转完成 答案&#xff1a;D 分析&#xff1a; 2、为了帮助用户通过全局…