双指针
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务,一个指针从前往后,另一个指针从后往前。
题目举例
有序数组sum
- 题目描述:在数组中找出两个数,使他们的和为target
输入:num = {1 , 3 , 6 , 9 } , target = 7
输出:[1 , 3]
方法:使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历
- 如果sum>target ,移动较大的元素,使sum变小一些
- 如果sum<target,移动较小的元素,使sum变大一些
- 如果sum=target,结果正确
class Solution:
def NumSum(self,nums,target):
i,j = 0
len(nums)=-1
while i<j:
sum = nums[i]+num[j]
if sum < target:
i += 1
elif sum > target:
j -= 1
else:
return [i+i,j+1]
return None
平方和
- 题目描述:判断一个数是否为两个数的平方和
输入:10
输出:True
方法:1 * 1 + 3 * 3 = 10 ,使用双指针一个指针指向较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历
- 将较小元素定义为0,较大元素定义为目标值的开平方
- 如果sum>target ,移动较大的元素,使sum变小一些
- 如果sum<target,移动较小的元素,使sum变大一些
- 如果sum=target,结果正确
class Solution:
def SquareSum(self,target):
i,j = 0
int(target ** 0.5)
while i <= j :
sum = i*i + j*j
if sum < target:
i += 1
elif sum > target:
j -= 1
else:
return True
return False
反转字符串中的元音字符
- 题目描述:反转字符串中的元音字母
输入:“csdnisgood”
输出:“csdnosgiod”
方法:使用双指针指向待反转的两个元音字符,一个指针从头向尾遍历,一个指针从尾到头遍历
class Solution:
def Ring(self,s:str) -->str:
vowel = ['a','e','i','o','u']
i,j = 0
len(s) = -1
s = list(s)
while i < j :
if s[i] in vowel and s[j] in vowel:
s[i] ,s[j] = s[j], s[i]
i += 1
j -= 1
elif s[i] not in vowel:
i += 1
elif s[j] not in vowel:
j -= 1
return '' .join (s)
回文字符串
- 题目描述:可以删除一个字符,判断是否能够成回文字符串
输入:“aba”
输出:True
方法:使用双指针指向字符串,一个指针从头向尾遍历,一个指针从尾到头遍历
- 如果双指针指着的两边的值不同的时候,选择跳过左边的或者右边的一个值,再去验证一遍
class Solution:
def validPalindrome(self,strs):
i,j = 0
len(strs) = -1
while i < j:
if strs[i] != strs[j]:
return self.isPalindrome(strs,j,j-1) | self.isPalindrome(strs,i+1,j)
i += 1
j -= 1
return True
def isPalindrome(self,strs,left,right):
while left < right:
if strs[left] != strs[right]:
return False
left += 1
right -= 1
return True