目录
双指针同向
将所有的0移到后面,要确保前面非0的数字是否需要保持原始位置。
解题步骤
i 的含义是 下一个可以被填充的位置。[0,i) 是已经处理好的数据。
例题:
leetcode 26
"""
easy
双指针同向,因为要保证顺序不变。
要求:不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
因为数组是有序的,那么重复的元素一定会相邻。
"""
class Solution:
def removeDuplicates(self, nums):
# i 左边是已经处理好的元素;
# 元素如果要话,ij都要右移;
# 元素如果不要的话,j右移,i不动;
# 当ij不在同一个位置上时,j标记的位置如果要的话,则将j的值赋给i。i++
# i 左边是处理好的元素。
i, j = 0, 1
# i=0说明i左边什么都没有,第一个元素肯定是不重复的
while j < len(nums):
# 不相等,则交换
if nums[j] != nums[i]:
i+=1
nums[i] = nums[j]
j+=1
else:
j += 1
return i+1
双指针反向
反向不会保持相对顺序。
解题步骤
有可能是交换两个值;有可能min(i,j)
注意每次一定要交换至少一个pointer。