leetcode双指针问题总结 Python

目录

1. 二分查找

2. 有序数组中寻找两个数和等于某数

3. 两数平方和

4. 翻转字符串中的元音字符

5. 判断是否为回文字符串(最多可以删除一个字符)

6. 归并两个有序数组

7. 判断链表是否有环

8. 最长子序列


1. 二分查找

从有序数组 nums 中查找等于 v 的索引

示例:

输入:nums=[1,3,6,8,9], v=3

输出:1

二分查找表面上非常简单,但是实际编程还是有几个点需要注意,否则极易出现 bug。如果我们处理的是连续数值,那就容易的多,但本题目是离散整数值,所以需要注意当左指针 left 与右指针 right 相差仅仅为 1 时的处理,处理办法就是分别在左值和右值上加一和减一。

def fun(nums, v):left = 0right = len(nums) - 1while left <= right:          # 注意加入等号mid = (left + right) // 2if nums[mid] > v: right = mid - 1       # 注意需要 -1elif nums[mid] < v:left = mid + 1        # 注意需要 +1else:return midreturn None

2. 有序数组中寻找两个数和等于某数

给你一个下标从 1 开始的整数数组 numbers ,该数组已按非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。你可以假设每个输入只对应唯一的答案 ,而且你不可以 重复使用相同的元素。

示例:

输入:numbers = [2,7,11,15], target = 9

输出:[1,2]   解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 

def twoSum(numbers, target):low, high = 0, len(numbers)-1while low < high:sum = numbers[low] + numbers[high]if sum == target:return [low+1, high+1]if sum > target:high -= 1else:low += 1return [-1, -1]

3. 两数平方和

给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c

示例:

输入:c = 5

输出:true   解释:1 * 1 + 2 * 2 = 5

在 python 中开根号有三种方式,math.sqrt()、cmath.sqrt()、pow(,),推荐使用最后一种的内置函数。

def judgeSquareSum(c):low = 0high = int(pow(c, 0.5))while low < high:res = pow(low, 2) + pow(high, 2)if res == c:return Trueelif res > c:high -= 1else:low += 1return False

4. 翻转字符串中的元音字符

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。

示例 :

输入:s = "hello"

输出:"holle"

在 python 中字符串不支持 a,b=b,a 所以需要提前将字符串转换为 List。

def reverseVowels(s):left, right = 0, len(s)-1vowel = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']s_list = list(s)while left < right:if s_list[left] in vowel and s_list[right] in vowel:s_list[left], s_list[right] = s_list[right], s_list[left]left +=1right -= 1if s[left] not in vowel:left +=1if s[right] not in vowel:right -= 1return "".join(s_list)

5. 判断是否为回文字符串(最多可以删除一个字符)

给你一个字符串 s,最多可以从中删除一个字符。请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

示例:

输入:s = "aba"

输出:true

def validPalindrome(s):def check(s, low, high):while low < high:if s[low] == s[high]:low += 1high -= 1else:return Falsereturn Truelow = 0high = len(s) - 1while low < high:if s[low] == s[high]:low += 1high -= 1else:if check(s, low, high-1) or check(s, low+1, high):return Truereturn Falsereturn True

6. 归并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

def merge(nums1, m, nums2, n):p1, p2 = m - 1, n - 1tail = m + n - 1while p1 >= 0 and p2 >= 0:if nums1[p1] > nums2[p2]:nums1[tail] = nums1[p1]p1 -= 1else:nums1[tail] = nums2[p2]p2 -=1tail -= 1while p1 >= 0:nums1[tail] = nums1[p1]p1 -= 1tail -= 1while p2 >= 0:nums1[tail] = nums2[p2]p2 -=1tail -= 1

7. 判断链表是否有环

给你一个链表的头节点 head ,判断链表中是否有环。

该问题有两个思路,第一个思路是搭建一个哈希表存储访问过的每一个 node 的地址,然后每访问一个 node,就检查一遍哈希表。第二个思路是快慢指针,如果链表有环那快慢指针一定会相遇。这两个思路都需要解决同一个问题即怎么判断两个 node 是同一个 node,leetcode 原生代码是推荐使用 == 运算法直接判断,但是这样判断只能说明两个 node 的值相等,不能保证是同一个 node,所以还是推荐使用 id() 函数比较 node 的地址。哈希表在运算时间上有优势,双指针在所用内存上有优势。

def hasCycle(head):if head == None:return Falseslow, fast = head, headwhile fast != None and fast.next != None:slow = slow.nextfast = fast.next.nextif id(fast) == id(slow):  # 原生代码是 fast == slowreturn Truereturn False

8. 最长子序列

给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。

示例:

输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]

输出:"apple"

def findLongestWord(s, dictionary):def fun(s, target):len_s, len_target = len(s), len(target)p1, p2 = 0, 0while p1 < len_s and p2 < len_target:if s[p1] == target[p2]:p2 += 1p1 += 1return p2 == len_targetres = ""for target in dictionary:if fun(s, target):if len(target) > len(res):res = targetelif len(target) == len(res) and target < res:res = targetreturn res

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

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

相关文章

uniapp获取手机当前信息及应用版本

appVersion 是app端查询的数据信息 appWgtVersion 是浏览器端查询的数据信息 onLoad() {const systemInfo uni.getSystemInfoSync();console.log(systemInfo);// #ifdef H5const uniAppVersion systemInfo.appVersion;// #endif// #ifndef H5const uniAppVersion systemIn…

C++学习笔记——对象的指针

目录 一、对象的指针 二、减少对象的复制开销 三、应用案例 游戏引擎 图像处理库 数据库管理系统 航空航天软件 金融交易系统 四、代码的案例应用 一、对象的指针 是一种常用的技术&#xff0c;用于处理对象的动态分配和管理。使用对象的指针可以实现以下几个方面的功…

无法访问Bing网站 - 解决方案

问题 Bing官方网址&#xff1a;https://www.bing.com/ 电脑无法访问Bing网站&#xff0c;但手机等移动设备可以访问Bing网站&#xff0c;此时可尝试以下方案。 以下方案适用于各种系统&#xff0c;如Win/Linux系统。 解决方案 方案1 修改Bing网址为&#xff1a;https://www4…

JAVA毕业设计632—基于Java+ssm的宠物店商城系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于Javassm的宠物店商城系统(源代码数据库)632 一、系统介绍 本项目分为用户、营养师、管理员三种角色 1、用户&#xff1a; 登录、注册、宠物信息、宠物粮食、宠物用品、宠物疫…

二叉树基础oj练习(单值二叉树、相同的树、二叉树的前序遍历)

讲了这么多数据结构相关的知识(可以看我的数据结构文章专栏): 抓紧刷题巩固一下了 目录 1.单值二叉树 题目描述 思路1 代码1 思路2 代码2 2.相同的树 题目描述 思路 代码 3.二叉树的前序遍历 代码 思路 1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCod…

C#进行Web API开发时,遇到的常见问题

当使用C#进行Web API开发时&#xff0c;可能会遇到以下一些常见问题&#xff1a; 跨域请求 由于浏览器的同源策略限制&#xff0c;跨域请求可能会引发问题。解决方法可以使用CORS&#xff08;跨域资源共享&#xff09;来允许从特定的域名或端口访问你的API。 // 添加CORS中间…

influx v2 cli设置influxdb过期策略

目录 背景解法设置config设置buckets找到需要修改的bucket ID更新bucket保留策略 参考资料 背景 最近刚使用influxdb&#xff0c;需要对某个db设置一个过期策略。由于初次使用&#xff0c;对influx client命令行不熟悉&#xff0c;于是在网上找相关的教程&#xff0c;但是搜到…

pycharm社区版配置flask开发环境

新建配置文件&#xff0c;类型选择Shell Script 设置Execute中flask.exe的路径 设置options &#xff1a;--appflask_app.py run --port5000 --debug 设置working 路径 设置环境变量FLASK_APPflask_app.py;FLASK_ENVdevelopment 注意&#xff1a;FLASK_APPflask_app.py和上…

YOLOv8 损失函数改进 | 引入 Shape-IoU 考虑边框形状与尺度的度量

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 论文讲解加入代码本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总…

Android Studio 最新版本首次下载和安装以及汉化教程【+第二次安装使用教程】

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本教程详解首次安装和下载最新版本的Android Studio &#xff0c;以及汉化教程。另外详解当第二次下载使用时解决遇到的问题。 目录 1.Android Studio 下载 2.Android Studio 首次…

【Unity】优化 if else 和 Switch Case

优化 if else 和 Switch Case z 大量的if else 和 Switch Case会造成代码冗余且消耗性能&#xff0c;可以借用如下方法优化 使用字典进行优化 方法优化&#xff1a; //注册字典&#xff0c;通过Action作为值&#xff0c;然后进行回调 private Dictionary<int, Action<Cha…

Hadoop之mapreduce参数大全-1

1.设置Map/Reduce任务允许使用的最大虚拟内存大小 mapred.task.maxvmem是MapReduce的一个配置参数&#xff0c;用于指定每个Map/Reduce任务允许使用的最大虚拟内存大小&#xff08;以字节为单位&#xff09;。如果一个任务使用的虚拟内存超过了此参数指定的值&#xff0c;则任…

【云计算】云计算概述

1. 云计算概述 1.1 云计算的定义 美国国家标准与技术研究院(NIST)定义 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可配置的计算资源共享池(资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件…

Xmind - win10安装破解Xmind2023

Xmind - win10安装破解Xmind2023 1、下载 Xmind下载 提取码:we6i 2、安装 Step 1:双击运行 exe文件 Step 2:忽略最新版本 最近更新选择继续升级至Pro选择取消Step 4:直接选择同意授权

Java线程池最全详解

1. 引言 在当今高度并发的软件开发环境中&#xff0c;有效地管理线程是确保程序性能和稳定性的关键因素之一。Java线程池作为一种强大的并发工具&#xff0c;不仅能够提高任务执行的效率&#xff0c;还能有效地控制系统资源的使用。 本文将深入探讨Java线程池的原理、参数配置…

【python基础】一文搞懂:Python 中轻量型数据库 SQLite3 的用法

一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法 文章目录 一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法1 引言2 SQLite3 简介3 基本步骤4 示例代码4.1 连接数据库4.2 创建表4.3 插入数据4.4 查询数据4.5 更新/删除数据4.6 关闭数据库连接 5 实例演示…

java如何使用poi-tl在word文档里面渲染多张图片

1. Poi-tl官网 http://deepoove.com/poi-tl/ 2.引入依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3.编写Word图片模版 {{?pictures}}{{pictur…

NPN PNP磁性开关区别

自记&#xff1a; 网上有些前后内容是相反的&#xff0c;估计自己就没明白&#xff0c;此为分析后得出结论&#xff0c;看完后可懂 1、NPN&#xff08;源型&#xff09;&#xff1a;当导通时输出低电平 当导通时&#xff0c;信号输出线out和0v线连接&#xff0c;相当于输出低电…

代码随想录算法训练营——数组篇总结

理解数组的逻辑结构与物理结构&#xff0c;数组是存放在连续内存空间上的相同类型数据的集合。数组的删除只能用覆盖经典题目1&#xff1a;二分法&#xff0c;要深刻理解循环不变量法则&#xff0c;这也是写代码的重要法则经典题目2:双指针法&#xff0c;暴力破解两层循环都可以…

OCP NVME SSD规范解读-6.标准日志要求-1

4.8 Log Page Requirements章节在NVMe规范中主要涵盖了设备应支持的日志页面&#xff08;Log Pages&#xff09;的要求。日志页面是存储控制器用于报告内部状态、性能统计和其他关键信息的结构化数据区域&#xff0c;它们对系统管理和故障诊断至关重要。 本文&#xff0c;我们…