leedcode 704
二分查找 - 二分法是非常重要的基础算法,考察对区间的理解。
关键思想:真正的关键点在于理解 [] 或者 [) 的核心是指示区间的两个指针
class Solution:
def search(self, nums: List[int], target: int) -> int:
'''
关键:
1. 确定不变区间
2. 确定 while 的出口
[-1,0,3,5,9,12]
0,1,2,3,4,5
'''
# 确定二分查找的左右端点, 不变区间[)
lift = 0
right = len(nums)
while lift < right:
# 把 nums 分成两份
mindle = (lift + right-1) // 2
# while 出口就是 if 判断
# 如果target 小于 mindle,那么确定 target 在左边,更新 right 端点
if target < nums[mindle]:
right = mindle
# 如果target 大于 mindle,那么确定 target 在右边,更新 lift 端点
elif target > nums[mindle]:
lift = mindle + 1
# 如果target = mindle,返回middle 索引
else:
return mindle
return -1
leedcode 27
思想:重要的是快针遍历数组,找出哪些不需要删除的元素。慢针按顺序将这些不需要删除的元素放置好
# 快慢针
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
'''
数据结构三要素
逻辑:快慢针,快针找出不同的元素,
物理:数组是连续的;要求空间复杂度 O(1);快针找到的地址给慢针
算法:快慢针交换
'''
# 快慢针
s = 0
f = 0
while f < len(nums):
# 出口,不管怎么样,f 都会+1,保证 While 终止
if nums[f] != val:
nums[s] = nums[f]
s += 1
f += 1
return s