当前位置: 首页 > article >正文

双序列双指针

文章目录

  • 题目预览
  • 题目详解
    • 2540.最小公共值
    • 392.判断子序列

题目预览

双指针

2540.最小公共值

判断子序列

392.判断子序列

题目详解

2540.最小公共值

在这里插入图片描述

思路分析:对于该题,是 两个序列的问题,对应我们使用两个指针进行处理
但是对于双序列双指针的问题,容易弄混相对应的顺序以及思路

下面展示我开始的思路:表明上看,思路什么的没什么问题,

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        k1 = k2 = 0
        len1 = len(nums1)
        len2 = len(nums2)
        while k1 < len1 and k2 < len2:
            while k1 < len1 and nums1[k1] < nums2[k2]:  # 移动 nums1 的指针
                k1 += 1
            while k2 < len2 and nums2[k2] < nums1[k1]:  # 移动 nums2 的指针
                k2 += 1
            if nums1[k1] == nums2[k2]:
                return nums1[k1]
        return -1

越界访问
在 while k1 < len1 and nums1[k1] < nums2[k2] 和 while k2 < len2 and nums2[k2] < nums1[k1] 中,k1 和 k2 可能会超出数组范围。例如,如果 nums1 已经遍历完(k1 == len1),但 nums2 还未遍历完,代码会尝试访问 nums1[k1],导致越界。
逻辑缺陷
在移动指针后,没有检查 k1 和 k2 是否仍然在有效范围内,直接访问 nums1[k1] 和 nums2[k2]。

对应的修改:最外层的while进行边界的控制,里面使用if-else进行控制指针的移动即可

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        k1 = k2 = 0
        len1 = len(nums1)
        len2 = len(nums2)
        while k1<len1 and k2<len2:
            if nums1[k1]<nums2[k2]:
                k1+=1
            elif nums2[k2]<nums1[k1]:
                k2+=1
            else:
                return nums1[k1]
        return -1

看另外一个思路的代码:可以外层对于一个数组进行遍历,内层对另一个数组进行遍历

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        j, m = 0, len(nums2)
        for x in nums1:
            while j < m and nums2[j] < x:  # 找下一个 nums2[j] >= x
                j += 1
            if j < m and nums2[j] == x:
                return x
        return -1

392.判断子序列

在这里插入图片描述

思路分析:这个就是典型的,外层循环是其中一个字符串,内层循环是另一个字符串,不过该题对于字符的匹配以及最后的是否匹配的判断是否有意思
我们只需先判断这个s是否是空的,然后只要对于t中的相匹配的字符,我们就用i+1,最后的i如果是等于len(s)就说明匹配成功

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 先判断长度
        if not s:
            return True
        i = 0
        for c in t:
            if s[i] == c:
                i+=1
                if i == len(s):
                    return True
        return  False


http://www.kler.cn/a/510555.html

相关文章:

  • 数据库高可用方案-01-数据库备份还原方案
  • windows蓝牙驱动开发-蓝牙设备栈
  • 大数据时代的璀璨明珠:机器学习引领的智能应用革新与深度融合探索
  • [NOIP2012 提高组] 借教室
  • 学技术学英文:通过jmeter命令行工具生成聚合报告文件到csv文件
  • ASP .NET Core 学习(.NET9)配置接口访问路由
  • Python(十七)excel指定列自动翻译成英文
  • 多学科视角下探索开源Github、Git初步学习
  • 企业邮箱iRedMail搭建
  • 一岁征程:学习、挑战与成长
  • wireshark工具简介
  • 如何引导LabVIEW项目相关方合理参与项目?
  • 【2024年华为OD机试】(C卷,100分)- 求满足条件的最长子串的长度 (Java JS PythonC/C++)
  • Spring篇 解决因为Bean的循环依赖——理论篇
  • 基于springboot的教师人事档案管理系统
  • vue移动端统计分析echarts开发小结(多提示框渲染,下载适配,数据量大的时候不分页崩溃等)
  • 用LSTM模型预测股价的例子(1)
  • Chromium 132 编译指南 Linux 篇 - 安装 Chromium 官方工具(三)
  • 河北省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测评
  • 山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移测评
  • HRNet,Deep High-Resolution Representation Learning for Visual Recognition解读
  • 缓存、数据库双写一致性解决方案
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
  • Object常用的方法及开发中的使用场景
  • T-SQL语言的数据库交互
  • MYSQL数据库基础-01.数据库的基本操作