核心知识点:在缩小范围时,判断条件的区间开闭:左闭右开,左闭右闭 两种区间规则,左闭右开则左右不能相等,左闭右闭则可以相等。
一、二分查找
题目链接:https://leetcode.cn/problems/remove-element/submissions/
关键字:有序、无重复
解题思路:设置左右区间,通过中间值判断目标在左在右,然后调整左右界限,最终找到目标值。
代码如下:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = (left + right)//2
if nums[mid] > target:
right -= 1
elif nums[mid] < target:
left += 1
else:
return mid
return -1
二、双指针
题目链接:https://leetcode.cn/problems/remove-element/submissions/
关键字:原地修改,不使用额外空间(?)
解题思路:使用快慢两个指针,快指针遍历列表索引,慢指针确定要修改那个索引的值,修改完成后慢指针+1
代码如下:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
left, right = 0, 0
while right < len(nums):
if nums[right] != val:
nums[left] = nums[right]
left += 1
right += 1
return left