#704 二分法
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)
#704 二分查找
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 #左闭右闭,定义left和right的值
while left <= right:
mid = left + (right-left) // 2
num = nums[mid]
if num == target:
return mid
elif num > target:
right = mid - 1
else:
left = mid + 1
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) #左闭右开
while left < right:
mid = left + (right - left) // 2
num = nums[mid]
if num == target:
return mid
elif num > target:
right = mid #这里要想一下为什么等于mid,因为右开
else:
left = mid + 1
return -1
#35 搜索插入位置
#34 在排序数组中查找元素的第一个和最后一个位置
#27 移除元素
如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
整个过程保持不变的性质是:区间 [0,left) [0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后,left的值就是输出数组的长度。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = 0
slow = 0
while fast < len(nums):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
- 今日学习的文章链接
- 自己看到题目的第一想法
毫无头绪
- 看完代码随想录之后的想法
二分法的前提是数组为有序数组,同时题目还强调数组中无重复元素
移除元素可以用双指针遍历
- 自己实现过程中遇到哪些困难
左闭右开区间里,如果num大于target值,right变成什么值
#35 题目要我们返回第 1 个 大于等于 目标元素的下标;
如果目标元素 严格大于 输入数组中的最后一个元素,返回数组的最后一个元素的下标 +1(也就是数组的长度)
- 今日收获,记录一下自己的学习时长