二分查找法
一点思考:
1、使用二分法的条件 有序数组,无重复元素
2、为什么while条件是left<=right(因为right的值是能取到的,所以是闭区间。想一下仅有一个元素的时候,left=right=0)
3、为什么防止溢出 ,暂时看是因为left+middle值相加有大于整形最大值的风险,所以优化
4、直接把 所有条件都if else出来 可以更清晰一点
class Solution(object):
def search(self, nums, target):
left = 0
right = len(nums)-1
while left<=right:
middle = left +(right-left)/2
if nums[middle]==target:
return middle
elif nums[middle]<target:
left = middle +1
elif nums[middle]>target:
right = middle-1
return -1
移除元素
整体思路是这样的:
定义快慢指针
1、若快指针的值等于val,那么慢指针不动,一直往后找,fast++
2、若快指针的值不等于val,则快慢指针一起++,把快指针的值给慢指针
3、结束条件:fast<len
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = 0 # 快指针
slow = 0 # 慢指针
size = len(nums)
while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界
# slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow