双序列双指针
文章目录
- 题目预览
- 题目详解
- 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