- 类型:快慢指针
- 特点:有序数组的快慢指针
题目1:26. 删除有序数组中的重复项
-
题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
-
思路:01-初始化左右指针:left更新记录,right遍历;02-if判断,移动left,更新记录:重复则right继续向前,不重复则更新left并更新记录;03-返回结果。
-
经验:(1)删除重复元素<>保留不重复元素,所以只要if判断不重复,然后更新记录即可。(2)是/否两种条件判断可以用continue来实现,continue终止本次循环,跳过剩下的语句,进入下一次循环。
#判断到不重复
def removeDuplicates(self, nums: List[int]) -> int:
left=0
for right in range(len(nums)):
#不重复则更新left记录结果
if nums[right]!=nums[left]:
left+=1
nums[left]=nums[right]
#返回结果
return left+1
#判断到重复
def removeDuplicates(self, nums: List[int]) -> int:
left = 0
for right in range(len(nums)):
if nums[right] == nums[left]: #break完全结束循环,continue终止本次循环,进入下一次循环
continue
#否则
left += 1
nums[left] = nums[right]
return left + 1
题目2:80. 删除有序数组中的重复项 II
- 题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
- 参考题解:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/solution/yi-zhao-miao-sha-suo-you-tong-lei-xing-t-ws3g/
- 思路:01-初始化left和right;02-判断不合法情况;03-输出结果
- 经验:(1)right要从2开始遍历,才不会越界(2)if判断写合法/不合法情况都可以i,但是如果要扩展到不重复的k个元素,则用不合法来判断更好,因为连续k个等式更易表达。
def removeDuplicates(self, nums: List[int]) -> int:
left=1
for right in range(2,len(nums)):
#判断到重复,则不记录,继续循环
if nums[right]==nums[left] and nums[right]==nums[left-1]:
continue
#否则
left+=1
nums[left]=nums[right]
return left+1
题目3:最多重复k次
- 题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现k次 ,返回删除后数组的新长度。
- 参考题解:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/solution/yi-zhao-miao-sha-suo-you-tong-lei-xing-t-ws3g/
- 思路:01-初始化left和right;02-用tag循环来定义连等判断;03-判断不合法情况;04-输出结果
- 经验:(1)连续k个等式成立的巧妙判断:首先初始化tag=True,然后在循环中累乘等式的结果,只有k个式子全等,才能让循环后的tag=True,其他情况都是tag=False。
def removeDuplicates(self, nums: List[int], K: int) -> int:
#初始化
left = K - 1
for right in range(K, len(nums)):
#定义连等判断
tag = True
for i in range(K):tag *= nums[right] == nums[left - i]
#判断并更新left和记录
if tag:continue
left += 1
nums[left] = nums[right]
#输出结果
return left + 1
明日计划:缩减搜索空间,缩短时间复杂度
1. 两数之和:无序:哈希表(先判后村)
167. 两数之和 II - 输入有序数组有序:二分查找、双指针
15. 三数之和
18. 四数之和
11. 盛最多水的容器:双指针
633. 平方数之和