Python学习33 :解题方法----双指针法

双指针

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

题目举例

有序数组sum

  • 题目描述:在数组中找出两个数,使他们的和为target

输入:num = {1 , 3 , 6 , 9 } , target = 7
输出:[1 , 3]
方法:使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历

  1. 如果sum>target ,移动较大的元素,使sum变小一些
  2. 如果sum<target,移动较小的元素,使sum变大一些
  3. 如果sum=target,结果正确
class Solutiondef 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 ,使用双指针一个指针指向较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历

  1. 将较小元素定义为0,较大元素定义为目标值的开平方
  2. 如果sum>target ,移动较大的元素,使sum变小一些
  3. 如果sum<target,移动较小的元素,使sum变大一些
  4. 如果sum=target,结果正确
class Solutiondef 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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值