704.二分查找
题目:力扣
左闭右闭写法,也就是[left, right]
注意:
1、左闭右闭写法中,left=right合法,所以判断条件中left<=right
2、if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
3、计算middle时候注意处理middle的数据,不然会数据类型报错
class Solution:
def search(self, nums: List[int], target: int) -> int:
right = len(nums)-1
left = 0
if target < nums[left] or target > nums[right]:
return -1
while (left<=right):
middle = (left + right)//2
if target < nums[middle]:
right = middle - 1
elif target > nums[middle]:
left = middle + 1
elif target == nums[middle]:
return middle
if left > right:
return -1
左闭右开写法,也就是[left, right)
注意:
1、while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
2、if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
if target > nums[right-1] or target < nums[left]:
return -1
while(left<right):
middle = (left+right)//2
if target < nums[middle]:
right = middle
elif target > nums[middle]:
left = middle + 1
elif target == nums[middle]:
return middle
if left >= right:
return -1
27.移除元素
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
fast = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
return slow