704. 二分查找
注意:搜索空间的自洽
若while left<=right,则left与right都是可以取到的值(此时对应左闭右闭空间)。当num[middle]>target(num[middle]<target)时,num[target]则不包含在下一轮的搜索空间中,即在右闭的情况下,不能作为右边界,因此right=middle-1。
若while left<right,可以理解为取不到right的值(此时对应左闭右开空间)。num[middle]>target(num[middle]<target),此时若right=middle-1,则下一轮无法搜索到nums[middle-1],因此此时right=middle。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while left<=right:
middle = (left+right)//2
if nums[middle]==target:
return middle
elif nums[middle]>target:
right = middle-1
else:
left = middle+1
return -1
相关题目:
- 35.搜索插入位置(opens new window)
- 34.在排序数组中查找元素的第一个和最后一个位置(opens new window)
- 69.x 的平方根(opens new window)
- 367.有效的完全平方数(opens new window)
27. 移除元素
注意:
1. 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
2. 双指针的含义。本题中,快指针代表新数组的元素,慢指针代表新数组的位置。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast, slow = 0, 0
size = len(nums)
while fast < size:
if nums[fast] != val:
nums[slow]=nums[fast]
slow += 1
fast += 1
return slow
相关题目: