测开准备-day01数据结构力扣

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 的列表,这样就能正常通过下标赋值了。

欧克啊,今天也是做完了题,其实我以前做过,但是忘了

然后重新看视频思路清晰了很多,前两题的报错也是自己看然后修改的,最后一个报错确实不会改,继续学习吧

相关推荐
博界IT精灵2 小时前
栈在表达式求值中的应用(暂时看到视频3.3.2_1的25min19秒)
数据结构
北顾笙9803 小时前
测开准备-day03数据结构力扣
数据结构
仰泳的熊猫3 小时前
题目2571:蓝桥杯2020年第十一届省赛真题-回文日期
数据结构·c++·算法·蓝桥杯
尽兴-3 小时前
Redis7 底层数据结构解析
数据结构·数据库·缓存·redis7
逆境不可逃4 小时前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
leaves falling5 小时前
二分查找:迭代与递归实现全解析
数据结构·算法·leetcode
杰克尼5 小时前
知识点总结--01
数据结构·算法
咱就是说不配啊6 小时前
3.20打卡day34
数据结构·c++·算法
cui_ruicheng7 小时前
C++数据结构进阶:哈希表实现
数据结构·c++·算法·哈希算法·散列表