二分查找
代码:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)-1
while left <= right:
mid = left + (right-left)//2
if nums[mid] > target:
right = mid-1
elif nums[mid] < target:
left = mid+1
else:
return mid
return -1
重点:
- 理清楚查找的区间是左闭右闭还是左闭右开 ,也即target在的区间是左闭右闭还是左闭右开,以左闭右闭为例,nums = [-1,0,3,5,9,12],target = 0,最开始left =0, right = len(nums)-1=5,查找的索引范围为[0,5]因为要查找的元素可能在最后一个位置上,所以right=5,而左闭右开时这样的话,right = 6,索引范围[0,6),和[0,5]是同一个区间;
- mid = left + (right-left)//2,这样写的目的是防溢出,不至于计算(left+right)大的数,此时mid = 0+(5-0)//2 = 2,nums[2]=3>0,因为此时3已经判断过,我们需要查的索引区间是[0,1],所以当选择查找的区间是左闭右闭时,right = mid -1,区间是左闭右开时,区间应为[0,2),righ = mid;
- 终止条件,当左闭右闭时,left = right时依旧有意义在区间内所以条件为left <= right,当左闭右开时,left = righ时已经left不在搜索区间了,所以left < right。
移除元素
代码:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
for i in range(len(nums)):
if nums[i] != val:
nums[slow] = nums[i]
slow += 1
return slow
重点:
- 快慢指针