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

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

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

相关推荐
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦15 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾16 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82116 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q16 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒16 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记16 天前
单项不带头不循环链表
数据结构·链表