前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >LeetCode-双指针

LeetCode-双指针

作者头像
LittlePanger
发布于 2020-04-14 07:54:21
发布于 2020-04-14 07:54:21
52600
代码可运行
举报
运行总次数:0
代码可运行

双指针

双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。

167.两数之和 II - 输入有序数组

两数之和 II - 输入有序数组 示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 27 之和等于目标数 9 。因此 index1 = 1, index2 = 2

解法:

使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。

  • 如果两个指针指向元素的和 sum == target,那么得到要求的结果;
  • 如果 sum > target,移动较大的元素,使 sum 变小一些;
  • 如果 sum < target,移动较小的元素,使 sum 变大一些。

我的答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def twoSum(self, numbers, target):
        head = 0
        tail = len(numbers) - 1
        while 1:
            num = numbers[head] + numbers[tail]
            if num == target:
                break
            elif num > target:
                tail -= 1
                continue
            elif num < target:
                head += 1
                continue
        return [head, tail]

633.两数平方和

两数平方和

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

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 5
输出: True
解释: 1 ** 2 + 2 ** 2 = 5

输入: 3
输出: False

解法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a^2 + b^2 = c
a = sqrt(c - b^2)
因a>0 所以 b的范围为(0~sqrt(c))

答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        head = 0
        tail = int(c ** 0.5)
        while head <= tail:
            num = head ** 2 + tail ** 2
            if c == num:
                return True
            elif num > c:
                tail -= 1
            else:
                head += 1
        return False

345.反转字符串中的元音字母

反转字符串中的元音字母

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "hello"
输出: "holle"

输入: "leetcode"
输出: "leotcede"

解法:

使用双指针指向待反转的两个元音字符,一个指针从头向尾遍历,一个指针从尾到头遍历。

答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def reverseVowels(self, s: str) -> str:
        lis = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]
        list_s = list(s)
        head = 0
        tail = len(list_s) - 1
        while head < tail:
            if list_s[head] not in lis:
                head += 1
                continue
            elif list_s[tail] not in lis:
                tail -= 1
                continue
            else:
                list_s[head], list_s[tail] = list_s[tail], list_s[head]
                head += 1
                tail -= 1
                continue
        return "".join(list_s)

680. 验证回文字符串 Ⅱ

680. 验证回文字符串 Ⅱ

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "aba"
输出: True

输入: "abca"
输出: True
解释: 你可以删除c字符。

回文串问题,常用如下 Python 的解法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test = 'aba'
# 解一
print(test == test[::-1])  # True

# 解二
print(test == ''.join(reversed(test)))  # True
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def validPalindrome(self, s: str) -> bool:
        p1, p2 = 0, len(s) - 1
        while p1 < p2:
            if s[p1] != s[p2]:
                # 舍弃左字符
                a = s[p1 + 1: p2 + 1]
                # 舍弃右字符
                b = s[p1:p2]
                return a[::-1] == a or b[::-1] == b
            p1 += 1
            p2 -= 1
        return True

88. 合并两个有序数组

88. 合并两个有序数组

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

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

合并后排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution(object):
    def merge(self, nums1, m, nums2, n):
        nums1[:] = sorted(nums1[:m] + nums2)
# 

指针方法

一般而言,对于有序数组可以通过 双指针法 达到O(n + m)O(n+m)的时间复杂度。

最直接的算法实现是将指针p1 置为 nums1的开头, p2为 nums2的开头,在每一步将最小值放入输出数组中。

由于 nums1 是用于输出的数组,需要将nums1中的前m个元素放在其他地方,也就需要 O(m)O(m) 的空间复杂度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def merge(self, nums1: [int], m: int, nums2: [int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # 做个备份
        nums1_copy = nums1[:m]
        nums1[:] = []

        # 循环指针
        p1, p2 = 0, 0
        while p1 < m and p2 < n:
            if nums1_copy[p1] <= nums2[p2]:
                nums1.append(nums1_copy[p1])
                p1 += 1
            else:
                nums1.append(nums2[p2])
                p2 += 1

        # 剩余的添加进去
        if p1 < m:
            nums1.extend(nums1_copy[p1:])
        if p2 < n:
            nums1.extend(nums2[p2:])

141. 环形链表

141. 环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

解法

使用双指针,一个指针每次移动一个节点,一个指针每次移动两个节点,如果存在环,那么这两个指针一定会相遇。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        fast, slow = head, head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                return True
        return False

524. 通过删除字母匹配到字典里最长单词

524. 通过删除字母匹配到字典里最长单词

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:s = "abpcplea", d = ["ale","apple","monkey","plea"]
输出: "apple"

输入:s = "abpcplea", d = ["a","b","c"]
输出: "a"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法学习|双指针
Question 1 两数之和 II - 输入有序数组(https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/) 长按复制到浏览器即可到leetcode对应的题目, 算法的逻辑在具体的代码注释里 /** * 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 * * 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 * * 思路: * 使用双
微笑的小小刀
2019/08/22
4720
【算法/学习】双指针
双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞指针」。如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。
IsLand1314
2024/10/15
1120
【算法/学习】双指针
Leetcode模块训练1
1. 删除有序数组中的重复项(26)# 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 , 返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成 如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果 不需要考虑数组中超出新长度后面的元素 func removeDuplicates(nums []int) int { if len
素履coder
2022/11/14
2840
算法(二)双指针/迭代
3,需要熟练掌握String/StringBuffer/StringBuilder。
宇宙无敌暴龙战士之心悦大王
2022/01/10
2770
算法(二)双指针/迭代
一、基础数据结构
1、当移动<font style="color:rgb(233, 105, 0);background-color:rgb(248, 248, 248);">right</font>扩大窗口,即加入字符时,应该更新哪些数据?
阿东知识库1
2024/09/03
1710
一、基础数据结构
双指针问题-LeetCode 88、125(双指针,大小写转换)
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
算法工程师之路
2019/10/14
6140
LeetCode | 数据结构与算法 | 3月 合集
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
yiyun
2023/05/18
1840
LeetCode | 数据结构与算法 | 3月 合集
用Js怒刷LeetCode
针对有一定数据结构基础(了解链表, 二叉树, 二叉堆, 递归)的基本概念,并对时间空间复杂度有基本认知的。
hellocoder2028
2022/10/27
2.2K0
顺序表、链表相关OJ题(1)
本文为经典算法OJ题练习,大部分题型都有多种思路,每种思路的解法博主都试过了(去网站那里验证)是正确的,大家可以参考!!
小陈在拼命
2024/02/17
1230
顺序表、链表相关OJ题(1)
【LeetCode12】合并两个有序数组
我发现最近做的题目都可以用双指针算法来解决,这道题也一样,我们定义两个指针p1和p2,分别从数组1指定位置(由m决定)和数组2的尾端开始往前遍历。
Sam Gor
2019/07/08
6830
【LeetCode12】合并两个有序数组
查找算法常见的五大面试知识点与两类实战!
查找(Search),又称为搜索,指从数据表中找出符合特定条件的记录。如今我们处在信息爆炸的大数据时代,如何从海量信息中快速找到需要的信息,这就需要查找技术。如果有什么不懂的或要查询的,都会上网搜索一下,查找是最常见的应用之一。
Datawhale
2020/09/03
1.6K0
查找算法常见的五大面试知识点与两类实战!
LeetCode刷题记录(easy难度1-20题)
leetcode刷题记录 本文记录一下leetcode刷题记录,记录一下自己的解法和心得。
earthchen
2020/09/24
1.3K0
六十六、Leetcode数组系列(中篇)
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。决定今天比昨天要更加努力。前面文章,点击下面链接
润森
2020/06/16
5570
LeetCode-数据结构-数组-第2天
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
布衣者
2021/09/07
1740
leetcode 双指针算法专题
双指针是一种方法,一种思想一种技巧,也谈不上什么特别的算法,在二分查找中经常使用这个技巧,具体就是用两个变量动态的存储两个或者多个的结点,来方便我们进行一些操作,通常使用在线性结构中,比如说数组或者是链表。 在我们遇到像数组,链表这类数据结构的算法题目的时候,应该要想得到双指针的来解决问题。特别是链表类的题目,经常需要用到两个或多个指针配合来记忆链表上的节点,完成某些操作。链表这种数据结构也是树形结构和图的原型,所以有时候在关于图和树形结构的算法题目中也会用到双指针。
Albert_xiong
2021/06/21
5480
leetcode 双指针算法专题
数组双指针直接秒杀七道题目
所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。
labuladong
2022/03/30
5270
数组双指针直接秒杀七道题目
leetcode刷题(32)——88. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
老马的编程之旅
2022/06/22
1750
算法:双指针
双指针是一种思想或一种技巧并不是特别具体的算法。具体就是用两个变量动态存储两个结点,来方便我们进行一些操作。通常用在线性的数据结构中。
用户3578099
2022/04/18
3610
算法:双指针
C++刷题(一):顺序表 + 单链表
这道题的关键在于,如何讲nums2的数组元素插入nums1,因为nums1的长度为m+n,也就代表后面有空位,所以可以选择从后往前插入。
用户11029137
2025/03/15
430
C++刷题(一):顺序表 + 单链表
前端面试会遇到的 LeetCode 简单题!
大家好,我是山月,今天分享一篇文章,关于前端面试题目中的算法题目。这篇文章的作者是成都的孟祥同学。
山月
2021/08/10
8150
前端面试会遇到的 LeetCode 简单题!
相关推荐
算法学习|双指针
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文