704、二分查找
没看过讲解,自己写了一遍,用到的递归+引入一个偏移量更新索引:
class Solution:
def search(self, nums: List[int], target: int, left=0) -> int:
n = len(nums)
if not nums:
return -1
if n == 1:
return left if nums[0] == target else -1
mid = n // 2
if nums[mid] > target:
return self.search(nums[:mid], target, left)
elif nums[mid] < target:
return self.search(nums[mid+1:], target, left + mid + 1)
else:
return left + mid
接下来是 左闭右闭:
注意:左闭右闭和左闭右开的区别在于left和right的判断和边界处理
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (right + left) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
接下来是,左闭右开:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
27. 移除元素
这里主要是快慢指针的思想,当快指针指向的值与要移除的值相等,则慢指针不动,继续让快指针走,直到快指针指向的值与要移除的元素值不同,将慢指针的值更新为快指针的值,并且更新慢指针的索引。
最后慢指针指向的值就是原数组中最后一个不等于要移除的元素值的值,所以慢指针的值就是新数组的长度。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
return slow