704. 二分查找
思路:
1.数据结构:列表 / 数组
2.算法:二分搜索
3.步骤:
a.先将所给数组进行升序排序
b.初始左边界 i = 0, 初始右边界 j = len(nums) - 1 (闭区间解法)
c.进入 while 循环,得中间索引 mid = (i + j) >> 1
d.比较 nums[mid] 和 target 的大小,视情况收缩边界
4.tips:
a.二分搜索框架不难,重点在于细节,特别是边界值别写错。
b. (i + j)/ 2 等价于 (i + j)>> 1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = (left + right) >> 1
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
27. 移除元素
思路:
1.数据结构:列表 / 数组
2.算法:快慢双指针
3.步骤:
a.fast 和 slow 初值都设为0
b.fast 作为遍历数组的指针,slow 用于承接非目标值元素的指针
c.返回 slow 即可
4.tips:
a.关键在于 判断条件是 if nums[fast] != val
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