力扣-数组-双指针
题目顺序
27移除元素,26删除有序数组中的重复项,283移动零,844比较含退格的字符串,977有序数组的平方
解题思路
1.确定双指针,一个遍历数组,一个确定新数组元素
2.确定循环终止的条件一般是left<=right,具体根据实例判断
1 class Solution(object): 2 def removeElement(self, nums, val): 3 """ 4 :type nums: List[int] 5 :type val: int 6 :rtype: int 7 """ 8 # 双指针法,left从前往后定位val,right从后往前把非val换到left指向的val位置 9 left = 0 10 right = len(nums)-1 11 while(left<right):# 还没遍历完数组时进入循环 12 if nums[left]==val: 13 if nums[right]!=val: 14 nums[left] = nums[right] 15 left += 1 16 right -= 1 17 else: 18 right -= 1 19 else: 20 left += 1 21 # 判断跳出循环时,left和right的大小关系,返回left相关 22 # left指向要保留 23 if left==right and val!=nums[left]: 24 return left+1 25 # right<left或left==right,nums[left]==val,删除 26 else: 27 return left
1 class Solution(object): 2 def removeDuplicates(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 left, p = 0, 0 8 # 指针p指向新数组中确定的元素,指针left遍历整个数组; 9 right = len(nums)-1 10 while(left<=right): 11 # 如果left指向与新数组的p相同时,继续遍历,定p动left 12 if nums[p]==nums[left]: 13 left += 1 14 else: 15 # 如果left指向与新数组的p不一致时,更新p+1所在,p++ 16 nums[p+1] = nums[left] 17 p += 1 18 return p+1
1 class Solution(object): 2 def moveZeroes(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: None Do not return anything, modify nums in-place instead. 6 """ 7 # 双指针法 8 pos = 0 9 left = 1 10 right = len(nums)-1 11 while(left<=right): 12 if nums[pos]==0 and nums[left] != 0: 13 nums[pos] = nums[left] 14 nums[left] = 0 15 pos += 1 16 left += 1 17 elif nums[pos]==0 and nums[left] == 0: 18 left += 1 19 elif nums[pos] != 0: 20 pos += 1 21 left += 1 22 return pos
# 常规的双指针法解题,注意终止条件,if语句和返回值。
1 class Solution(object): 2 def backspaceCompare(self, s, t): 3 """ 4 :type s: str 5 :type t: str 6 :rtype: bool 7 """ 8 # 理解题目,要删除#和它之前相同个数的字符 9 s = list(s) 10 pos = 0 11 left = 0 12 right = len(s)-1 13 while (left <= right): 14 if pos<0:# 退格多于字符 15 pos = 0 16 if s[left]=='#':# 继续遍历 17 pos -= 1 18 left += 1 19 else:# 删掉一个元素 20 s[pos] = s[left] 21 pos += 1 22 left += 1 23 ss = ''.join(s[:pos]) 24 25 t = list(t) 26 pos = 0 27 left = 0 28 right = len(t)-1 29 while (left <= right): 30 if pos<0: 31 pos = 0 32 if t[left]!='#': 33 t[pos] = t[left] 34 pos += 1 35 left += 1 36 else: 37 pos -= 1 38 left += 1 39 tt = ''.join(t[:pos]) 40 return ss==tt 41 42
# 对字符串s而言,left指针用来遍历整个字符串,pos指针用来获取新字符串的内容;
# 当left不指向'#'时,对pos赋值;指向'#'时,pos退格,left前进。
class Solution(object): def sortedSquares(self, nums): """ :type nums: List[int] :rtype: List[int] """ # 双指针法,与直接排序的不同是,数组正负两端是有序的,所以可以一左一右一次比较 i, j, pos = 0, len(nums)-1, len(nums)-1 res = [0]*len(nums) while(i<=j): if nums[i]*nums[i]<nums[j]*nums[j]: res[pos] = nums[j]*nums[j] j -= 1 pos -= 1 else: res[pos] = nums[i]*nums[i] i += 1 pos -= 1 return res
# 因为原始数组正负两端是各自有序的,所以可以双指针,左右依次比较;
# 后续要用直接插入排序和快排做一下。