[leetcode] 双指针集锦(python实现)

在解题时,双指针的思想常常可以帮助我们优化解法的时间空间复杂度。接下来,我将通过两道LeetCode的题来给大家讲解双指针的使用方法。


文章目录

    • 题目1:Two Sum
    • 题目2:Three Sum
    • 双指针思想的总结

题目1:Two Sum

题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

解题思路:我们可以初始化两个指针分别指向数组的起始点和终点,如果两个指针所指的值之和大于target,则移动尾指针使得总和减小;如果两者相加小于target,则移动头指针使得总和增大。不断循环此过程,直到找到相加等于target的两个数,然后返回它们的下标。

代码实现

def twoSum(nums, target):nums = enumerate(nums)nums = sorted(nums, key=lambda x:x[1])l, r = 0, len(nums)-1while l < r:if nums[l][1]+nums[r][1] == target:return [nums[l][0], nums[r][0]]elif nums[l][1]+nums[r][1] < target:l += 1else:r -= 1

题目2:Three Sum

题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

解题思路:先将数组排序,然后遍历数组,对于每个元素,我们可以设置双指针分别指向该元素的后一位和数组的最后一位,如果三个数之和等于0,则记录下来;如果三个数之和小于0,则移动头指针;如果大于0,则移动尾指针。

代码实现

def threeSum(nums):nums.sort()res, k = [], 0for k in range(len(nums) - 2):if nums[k] > 0: break # 1.因为j>i>k, 所以如果nums[k] > 0那么后续不可能有三个数和为0if k > 0 and nums[k] == nums[k - 1]: continue # 2.避免出现重复结果i, j = k + 1, len(nums) - 1while i < j: # 3.双指针循环s = nums[k] + nums[i] + nums[j]if s < 0:i += 1while i < j and nums[i] == nums[i - 1]: i += 1 # 4.避免出现重复结果elif s > 0:j -= 1while i < j and nums[j] == nums[j + 1]: j -= 1 # 5.避免出现重复结果else:res.append([nums[k], nums[i], nums[j]])i += 1j -= 1while i < j and nums[i] == nums[i - 1]: i += 1 # 6.避免出现重复结果while i < j and nums[j] == nums[j + 1]: j -= 1 # 7.避免出现重复结果return res

双指针思想的总结

双指针是一种多用于解决数组/链表问题的简单却非常巧妙的思想。它的主要思路是用两个指针,一个快一个慢或者一个在前一个在后去遍历数据,帮我们降低时间复杂度,解决问题。它常常被应用于以下几种情况:

  • 两数之和/三数之和等问题:在已经排序的数组中用两个指针分别从头和尾向中间扫描,寻找满足条件的元素。
  • 链表中寻找中间节点或者是判断链表是否存在环等问题:通过一个快指针(一次移动两格)和一个慢指针(一次移动一格)在遍历的过程中找到解。
  • 归并排序中的合并操作:分别使用两个指针指向两个待归并的有序数组的头部,每次选取小的放入结果中,并移动选中的那个数组的指针。

使用双指针,我们可以在许多情况下将时间复杂度从原来的O(n^2)降低到O(n)。同时,双指针的理念也可以适用于多指针的情况,帮助我们解决更复杂的问题。在日常的编程实践中,我们可以多尝试和利用双指针的思想来解决问题。

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

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

相关文章

Selenium 定位编辑框有span

当使用Selenium进行网页自动化测试时&#xff0c;定位一个包含span元素的编辑框可能会有些棘手&#xff0c;因为span通常用于对其他HTML元素进行分组或应用样式&#xff0c;而不一定是真正的可输入字段。不过&#xff0c;一旦我们确定了正确的策略&#xff0c;定位编辑框还是相…

AtomicInteger

1. 前言 AtomicInteger是Java中的一个原子整数类&#xff0c;它提供了一种在多线程环境下进行原子性操作的方法。所谓原子性操作是指不会被线程调度机制打断的操作&#xff1b;这些操作可以在可能被其他线程影响的情况下作为一个不可分割的整体执行。 在并发编程中&#xff0…

【Android面试八股文】Android中操作多线程的方式有哪些?

文章目录 1. 使用 `Thread` 和 `Runnable`2. `AsyncTask`3. `Handler` 和 `Looper`4. `HandlerThread`5. `ThreadPoolExecutor`6. `IntentService`7. `RxJava`8. `Coroutine`(协程)9. `WorkManager`在Android开发中,有多种方式可以进行多线程操作。以下是主要的几种方式: 1…

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…

LeetCode题练习与总结:最长连续序列--128

一、题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&…

SpringBootWeb 篇-入门了解 Spring Cache 、Spring Task 与 WebSocket 框架

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Spring Cache 概述 1.1 Spring Cache 具体使用 1.1.1 引入依赖 1.1.2 Spring Cache 相关注解的介绍 2.0 Spring Task 概述 2.1 cron 表达式 2.2 Spring Task 使用…

基于微信公众号开发h5的前端流程

1.首先公众号进行配置&#xff0c;必须要https域名 还有个txt文件&#xff0c;有弹框提示需要下载放在服务器上 前端处理code的代码封装 // 微信公众号授权 export function wxAuthorize(calback) {// 非静默授权&#xff0c;第一次有弹框 这里的回调页面就是放在服务器上微信…

c语言连接两个字符串

在C语言中&#xff0c;连接两个字符串可以使用 strcat 函数。这个函数将一个字符串复制到另一个字符串的末尾。使用 strcat 函数之前&#xff0c;需要确保目标字符串有足够的空间来容纳源字符串&#xff0c;否则可能会导致缓冲区溢出。 下面是一个使用 strcat 函数连接两个字符…

外贸推广渠道有哪些

外贸推广渠道多种多样&#xff0c;每一种都有其特定的优势和适用场景。以下是一些常见的外贸推广渠道&#xff0c;它们被广泛用于吸引国际客户、增加品牌曝光度和促进销售。 外贸B2B平台推广&#xff1a; 阿里巴巴国际站&#xff1a;作为全球知名的B2B平台&#xff0c;汇聚了大…

MFC工控项目实例之五CFile类读写系统参数

承接专栏《MFC工控项目实例之四在调试目录下创建指定文件夹》 实时保存输入的iPlotX坐标轴最小值、最大值到CFG.PAR文件&#xff0c;打开界面从CFG.PAR文件中实时读取保存的最小值、最大值在编辑框中显示。 1、SEAL_PRESSURE.h中添加代码 class CSEAL_PRESSUREApp : public CW…

我主编的电子技术实验手册(07)——串联电路

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程

最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程 测试环境&#xff1a;apachePHP7.3MySQL5.7 源码免费下载地址抄笔记 (chaobiji.cn)

Web前端网页滚动效果:深度解析与创意实践

Web前端网页滚动效果&#xff1a;深度解析与创意实践 在Web前端设计中&#xff0c;滚动效果作为一种交互方式&#xff0c;不仅影响着用户体验&#xff0c;更在某种程度上定义了网页的视觉风格和动态特性。本文将深入剖析Web前端网页滚动效果的四个方面、五个方面、六个方面和七…

装饰器模式构建IO流体系

装饰器模式简介 装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对现有类的包装和装饰&#xff0c;使新的类具有更强的功能。 装饰器模式 class Iphone {private String name;public Iphone(String name){this.name name;}public void show(){System.out.pri…

C++前期概念(重)

目录 命名空间 命名空间定义 1. 正常的命名空间定义 2. 命名空间可以嵌套 3.头文件中的合并 命名空间使用 命名空间的使用有三种方式&#xff1a; 1:加命名空间名称及作用域限定符&#xff08;::&#xff09; 2:用using将命名空间中某个成员引入 3:使用using namespa…

MySql 数据库、表常用语句

数据库 查看当前所有数据库 mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema | | sys | --------------------创建一个新数据库 创建一个…

代码随想录算法训练营第六十二天 | 739.每日温度、496.下一个更大元素 I、503.下一个更大元素II

739.每日温度 文字讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;你该了解的&#xff0c;这里都讲了&#xff01;LeetCode:739.每日温度_哔哩哔哩_bilibili 解题思路 思路一&#xff1a;暴力双循环 O&#xff08;n^2&#xff09; 思路二&#xff1a;单…

ICML24麻省理工提出使用更少的条件独立性测试来发现因果关系新方法

【摘要】众多科学领域的核心问题围绕着理解因果关系这一基本问题。然而,大多数基于约束的因果发现算法,包括广受欢迎的PC算法,通常会进行指数级数量的条件独立性(CI)测试,在各种应用中造成局限。为解决这一问题,我们的工作重点是表征在减少CI测试数量的情况下,可以了解潜在因果…

js 数组有哪些方法

JavaScript 数组提供了许多内置方法来操作和处理数组。以下是一些常用的数组方法&#xff1a; 创建和操作数组的方法 Array.from()&#xff1a;从类数组对象或可迭代对象创建一个新的数组实例。 let arr Array.from(hello); // [h, e, l, l, o]Array.isArray()&#xff1a;判…

Explain Python Machine Learning Models with SHAP Library

Explain Python Machine Learning Models with SHAP Library – Minimatech &#xff08;能翻墙直接看原文&#xff09; Explain Python Machine Learning Models with SHAP Library 11 September 2021Muhammad FawiMachine Learning Using SHapley Additive exPlainations …