704.二分查找
我先去查了一下什么是二分法
一、一句话理解
把一堆已经排好序 的数据,不断分成两半,只在可能存在答案的那一半继续找,直到找到或确定不存在。
二、核心条件
-
数据必须有序(从小到大或从大到小)
-
可以随机访问(比如数组、列表)
三、时间复杂度
- 最坏:O(log n)
然后开始学习写二分法需要注意的问题,就是关于区间
区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
看了视频感觉很清晰,现在就简单写一下伪代码的版本
左闭右闭
python
left=0
right=numsize-1
while(left<=right)://因为左闭右闭,左边是可能等于右边可以画等号
middle=(left+right)/2
if num[middle]>target://那我们要找的数就在左边,更新right
right=middle-1//我们已经确定middle位置不是要找的,而且右边闭合,所以不加上middle而是使用middle-1
elif num[middle]<target:
left=middle+1//这个和之前的同理,就是左边闭合,我们不加上已经确定不在区间的数
else:
return middle
return -1
左闭右开
python
left=0
right=numsize//因为右开,不包含右边界
while(left<right)//左右边界不会有相等的时候
middle=(left+right)/2
if num[middle]>target:
right=middle//要找的在左边,更新右边界。右开,那就可以直接赋值middle
elif num[middle]<target:
left=middle+1//要找的在右边,更新左边界,但是左闭,要把middle弄在区间外面,middle+1
else:
return middle
return -1
写力扣704二分查找

看第一排报错是索引要整数不是浮点型,是我middle计算这里出了问题
用的是(left+right)/2,应该是整除(left+right)//2
修改后第二次提交通过

相关推荐

27.移除元素
删除数组中等于这个目标值的元素,并返回新数组的大小
库函数使用:如果这个题目用库函数一下子就解决了,不建议用库函数
补充数组理论知识

双指针思路,复杂度O(n):
伪代码
python
slow=0
fast=0
for(fast=0;fast<numsize;fast++):
if(nums[fast]!=val):
//删去不是val的值,那么就是只处理不等于val的
//快指针用来获取新数组中的元素
//慢指针获取新数组中需要更新的位置
nums[slow]=nums[fast]
slow++
//如果等于val那么不会进去if里面,slow也不会进行更新
//这里有一个点是,当最后一次更新,slow还是进行了++操作,那么slow的大小就是数组的大小

1.slow++在python中不允许,使用slow=slow+11.
2.边界越界问题


977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
这里我是完全想不到双指针的,比较容易想到的应该就是,先全部平方,再排序。
但是这样时间复杂度好像比较大
所以引出了这个双指针法:比较重要的点在于,最小的负数平方之后可能变成最大的,有序数组的两边大,逐渐往中间收拢这样一个趋势
伪代码
python
result=[]//用来保存结果
k=numsize-1
for(i=0,j=numsize-1;i<=j;)//i<j的话,i==j的情况会退出循环,就是会少处理一个元素
if(nums[i]*nums[i]>nums[j]*nums[j]):
result[k]=nums[i]*nums[i]
k--
i++
else://包含小于和等于的情况
result[k]=nums[j]*nums[j]
k--
j--
return result
好了,我发现是我赋值给了nums,应该给res,但是修改之后又出现了边界问题
不会改,问了AI
python
nums=[-4,-1,0,3,10]
# 仅修改这一行:把空列表改为和nums长度相同的初始列表
res = [0] * len(nums) # 原代码是 res = []
唯一的修改点:将 res = [] 改为 res = [0] * len(nums)。
原代码中 res 是空列表,直接通过下标 res[k] 赋值会触发「索引超出范围」错误;而 [0] * len(nums) 会创建一个和 nums 长度相同、初始值全为 0 的列表,这样就能正常通过下标赋值了。

欧克啊,今天也是做完了题,其实我以前做过,但是忘了
然后重新看视频思路清晰了很多,前两题的报错也是自己看然后修改的,最后一个报错确实不会改,继续学习吧