力扣二分查找
总体来讲属于回顾代码和思路,复习了二分查找的思路
力扣移除元素
第一想法 通过覆盖原来的元素,实现元素的删除操作。但是在如何实现代码上面出现问题。
看完代码随想录:通过设置快慢指针,将快指针指向下一个元素,并且将与给定值不同的元素移动到前一个与给定值相同的元素上面,实现了相同元素的删除操作,而后慢指针则进行加一操作,直到快指针到达数组尾部即可。
相同类型题目的框架总结:
# 删除有序数组的重复项
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
fast = slow = 1 # 删除重复元素之后也至少剩下一个元素
while fast < n:
if nums[fast] != nums[fast - 1]: # 说明nums[fast] 和之前的元素都不同
nums[slow] = nums[fast] # nums[fast] 的值复制到 nums[slow]
slow += 1
fast += 1
return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
# 删除有序数组中的重复项II 每个元素最多出现两次
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
n = len(nums)
if (n <= 2) :
return n
slow, fast = 2, 2 # 数组的前两个数必然可以被保留
while (fast < n) :
# 检查上上个应该被保留的元素nums[slow−2]是否和当前待检查元素nums[fast]相同
if nums[slow - 2] != nums[fast] :
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
# 通解扩展
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
def solve(k): # 最多保留k位相同数字
slow = 0 # 慢指针从0开始
for fast in nums: # 快指针遍历整个数组
# 检查被保留的元素nums[slow−k]是否和当前待检查元素fast相同
if slow < k or nums[slow - k] != fast:
nums[slow] = fast
slow += 1
return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
return solve(2)