python必刷算法

news2024/11/18 10:35:32

数组

二分法

在这里插入图片描述
二分法满足从小到大排序无重复元素
1 两个边界,left,right
2 中间值的选择
3 边界问题考虑有两种
left <= right
当left <= right的时候,说明mid比较的时候已经比较了left right

def search(self, nums: List[int], target: int) -> int:
    left = 0
    right = len(nums) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] < target: # 中间值小于t,说明t在右边边界,这个时候需要移动左边界
            left = mid + 1
        elif nums[mid] > target: # 中间值小于t,说明t在mid左边,移动右边界
            right = mid - 1
        else:
            return mid
    return -1
left < right
    当left < right的时候,说明比较的时候没有比较right


def search(self, nums: List[int], target: int) -> int:
    left = 0
    right = len(nums) - 1  # 左闭右开,所以right应该=len(nums)
    while left < right:
        mid = left + (right - left) // 2
        if nums[mid] < target: # 中间值小于t,说明t在右边边界,这个时候需要移动左边界
            left = mid + 1
        elif nums[mid] > target: # 中间值小于t,说明t在mid左边,移动右边界
            right = mid # 左闭右开区间,说明right判断的时候没有加入,所以需要加入right
        else:
            return mid
    return -1

移除元素

移除数组中目标值相同的元素,还不能创建新的数组
这个时候使用快慢指针,慢指针负责指向不等于val的值,快指针负责找与val相同的值,然后进行更新

    def removeElement(self, nums: List[int], val: int) -> int:
        slow = 0
        fast = 0
        size = len(nums)
        while fast < size:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

有序数组的平方

数组中存在正负数,所以这个时候往新数组里面存入的时候就需要比较,因为数组长度固定,所以新数组可以从后往前进行赋值,这样就会得到从小到大的排序

    def sortedSquares(self, nums: List[int]) -> List[int]:
        size = len(nums)
        new = [0] * (size) # 创建新数组 新数组几个元素就乘以几
        left,right = 0, size - 1
        # 循环情况需要把长度数组都放一编,所以循环新数组即可
        for i in range(size-1,-1,-1):
            if nums[left]**2 > nums[right]**2:
                new[i] = nums[left]**2
                left += 1
            else:
                new[i] = nums[right]**2
                right -= 1
        return new

长度最小的子数组

数组里面找到长度最小的和等于目标值,数组值只用一次
从第一个开始找,找到和等于目标值之后继续从第二个开始,最后找出最小的长度

    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 两个快慢指针,慢的负责记录初始值,快的负责记录到目标值的长度之后继续前进
        left,right = 0,0
        size = len(nums)
        minlen = float('inf')
        newsum = 0
        count = 0
        while right < size:
            newsum += nums[right] # 先开始加起来
            while newsum >= target: # 因为有可能newsum的值很大,所以要不断的移动最左边
                minlen = min(minlen,right-left + 1)
                newsum -= nums[left]
                left += 1
            right += 1
        return minlen if minlen != float('inf') else 0 # 不满足返回0

螺旋矩阵

螺旋矩阵主要是判断边界在哪里,规定好边界,一切迎刃而解
在这里插入图片描述
在这里插入图片描述
发现从3开始的奇数项,中间都有一个值,而且是居中的,所以可以通过长度来得到
发现从3开始,外层可以 8/4=2 12/4=3 16/4=4,那么是否可以推导n的外层就是x/4=n-1
所以我们是否可以每行都由n-1构成,这样就可以得到如下
在这里插入图片描述
此时通过观察,不难发现如果要进行循环,那么是由n//2=2,这样发现可以循环几圈
在这里插入图片描述
从左到右,00,01,02,03 -> 11,12 x不变 y 变
从上到下,04,14,24,34 -> 13,23 x变y不变
从右到左,44,43,42,41
从下到上,40,30,20,10
此时横坐标为i,纵坐标为j,这样就很容易写出四条循环来进行填充

动态规划

斐波那契数

1 确定dp数组及其下标含义
dp[i] 第i个数的斐波那契数为dp[i]
2 确定递推公式
dp[i] = dp[i-1] + dp[i-2]
3 初始化
dp[0]=0 dp[1]=1
4 确定遍历数序
发现后一项由前两项得到,所以从前往后遍历
5 验证

    def fib(self, n: int) -> int:
        dp = [0] * (n+1)
        dp[0] = 0
        dp[1] = 1
        for i in range(2,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

通过观察发现,一直变化的就两个变量

    def fib(self, n: int) -> int:
        if n <= 1:
            return n
        dp = [0,1]
        for i in range(2,n+1):
            temp = dp[0] + dp[1]
            dp[0] = dp[1]
            dp[1] = temp
        return dp[1]

爬楼梯

爬楼梯每次可以爬一层,也可以爬两层,说明第三层由第一层和第二层得到
1 确定dp数字的下标及其含义
dp[i] 第i层的时候的方法数是dp[i]
2 确定递推公式
dp[i] 由dp[i-1] dp[i-2]得到
所以dp[i] = dp[i-1]+dp[i-2]
3 初始化
dp[1] = 1 dp[2] = 2
4 确定遍历顺序
由于第三层是由第一层跟第二层得到,所以顺序遍历
5 验证

    def climbStairs(self, n: int) -> int:
        dp = [0] * (n+1)
        if n > 0 and n <=2:
            return n
        dp[1] = 1
        dp[2] = 2
        for i in range(3,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

使用最小花费爬楼梯

1 确定dp数组及其下标含义
dp[i] 爬到第i阶楼梯所需的花费
2 确定递推公式
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
3 初始化
爬楼梯可以爬1层或两层
说明爬1层或两层的时候,他的价值就是cost[i],所以
dp[0] = 0 dp[1] = 0
4 确定遍历顺序
第三层楼梯是由前两层得到的,所以从前往后遍历
5 验证

    def minCostClimbingStairs(self, cost: List[int]) -> int:
        n = len(cost)
        dp = [0] * (n+1)
        dp[0] = 0
        dp[1] = 0
        for i in range(2,n+1):
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
        return dp[n]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1541620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析与挖掘

数据起源&#xff1a; 规模庞大&#xff0c;结构复杂&#xff0c;难以通过现有商业工具和技术在可容忍的时间内获取、管理和处理的数据集。具有5V特性&#xff1a;数量&#xff08;Volume&#xff09;&#xff1a;数据量大、多样性&#xff08;Variety&#xff09;&#xff1a…

基于VS code 实现Java前后端打通—基础—使用Springboot+postgreSql+mybatis+Navicat

前言&#xff1a; 作者学习webjava后的而总结&#xff0c;总的流程概括就是先使用springboot创建项目&#xff0c;在application.properties中完成相应的postgreSql和mybaits的环境配置和.xml文件中dependecy依赖配置&#xff0c;entities实现数据表的类型模板&#xff0c;分别…

隐私计算实训营学习四:SecretFlow的安装和部署

文章目录 一、SecretFlow安装二、SecretFolw部署模式简介三、SecretFlow部署-仿真模式四、SecretFlow部署-生产模式 一、SecretFlow安装 SecretFlow运行要求&#xff1a; Python > 3.8操作系统&#xff1a;CentOS7、Anolis8、Ubuntu 18.04/20.04、macOS 11.1、WSL2资源&am…

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码&#xff1a;1XX&#xff08;信息&#xff09…

论文阅读:UniFormer和UniFormerV2

文章目录 UNIFormer动机方法动态位置嵌入(DPE)多头关系聚合器(MHRA) 模型代码总结 UniFormerV2动机方法整体框架实现细节 总结 UNIFormer 本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码&#xff1a;https://git…

购买腾讯云服务器需要多少钱?价格表查询

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

Python综合实战案例-数据清洗分析

写在前面&#xff1a; 本次是根据前文讲解的爬虫、数据清洗、分析进行的一个纵隔讲解案例&#xff0c;也是对自己这段时间python爬虫、数据分析方向的一个总结。 本例设计一个豆瓣读书数据⽂件&#xff0c;book.xlsx⽂件保存的是爬取豆瓣⽹站得到的图书数据&#xff0c;共 6067…

html网页制作-3D旋转卡片

网页制作-3D旋转卡片 两种旋转卡片的制作 旋转卡片&#xff08;1&#xff09; 代码 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

Transformer的前世今生 day03(Word2Vec、如何使用在下游任务中)

前情回顾 由上一节&#xff0c;我们可以得到&#xff1a; 任何一个独热编码的词都可以通过Q矩阵得到一个词向量&#xff0c;而词向量有两个优点&#xff1a; 可以改变输入的维度&#xff08;原来是很大的独热编码&#xff0c;但是我们经过一个Q矩阵后&#xff0c;维度就可以控…

linux命令(八)

搜索 其实很多人使用linux的是因为服务器是linux系统&#xff0c;既然是服务器&#xff0c;那查找日志肯定是大家用的很多的了&#xff0c;这一节就来介绍一下搜索的命令 grep 先看一下我的文件中的内容是什么 查找不包含该字符串的行 -v v代表的invert-match(不匹配的行) …

基于Java中的SSM框架实现电能计量与客户服务管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现电能计量与客户服务管理系统演示 摘要 当前时代的两个突出特征是世界经济一体化和以计算机为代表的信息技术的迅速发展。为了使组织在激烈的竞争中保持实力和发展&#xff0c;它必须对迅速变化的环境做出有效而有效的响应。 管理信息系统的应用可以提供…

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思 序现代诗古体诗 《夜风颂》作者王锴&#xff0c;前段时间加入书架的书&#xff0c;前边有几首现代诗挺惊艳&#xff0c;蛮喜欢的&#xff0c;后边古体诗稍逊色些。值得一读的一本小诗集。 序 海鸥之…

11.创建后台系统项目

后台系统项目 兼容性 vite官网&#xff1a;https://vitejs.dev/ vite中文网&#xff1a;https://cn.vitejs.dev/ vite需要node.js版本 >14.0.0&#xff0c;建议16 node -v 查看版本号 创建项目 进入存放目录 执行命令 npm create vitelatest 选择vue框架 选择typescript…

缓存穿透、缓存击穿、缓存雪崩及其解决方法

缓存穿透、缓存击穿、缓存雪崩是redis的三大问题。 在介绍这三大问题之前&#xff0c;我们需要先了解Redis作为一个缓存中间件&#xff0c;在项目中是如何工作的。首先看一下在没有缓存中间件的时候的系统数据访问的架构图&#xff1a; 客户端发起一个查询请求的时候&#xff…

一个软开关,长按开机,自动关机的实现。

连接说明&#xff1a; 1.ADP_PWR接适配器输入插座 当适配器插入的时候 ADP_PWR接入适配器7.4~8.4V电压 2.ON/OFF_KEY 接开关按键&#xff0c;当开关按下的时候&#xff0c;ON/OFF_KEY 接入电池电压 7.4V 3.ON/OFF_CTRL接单片机IO口 开机实现说明&#xff1a; 1.长按开…

存储随笔原创科普视频首播~

一周之前&#xff0c;存储随笔创建了B站账号。小编利用上个周末休息时间专门研究了B站视频录制的各种方案。发现并没有想象的很容易&#xff0c;先花了很长时间准备了一个PPT&#xff0c;再准备演讲大纲&#xff0c;最终磕磕绊绊完成了首期原创视频录制&#xff01; 可能不尽如…

Mybatis中显示插入数据成功,但在数据库中却没有显示插入的数据

1、在mybatis-config.xml中查看是否添加了JDBC&#xff0c;并引入了映射文件 2、在测试文件中&#xff0c;结尾是否添加提交事务&#xff1a;sqlSession.commit() 添加了这一步就能够将数据提交到数据库中&#xff0c;最后再关闭事务&#xff1a;sqlSession.close() * 如果运…

基于SpringBoot校园外卖服务系统设计与实现

点赞收藏关注 → 私信领取本源代码、数据库 一、项目概述 项目名称&#xff1a;基于SpringBoot校园外卖服务系统设计与实现 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 主要技术&#xff1a;SpringBootMybatisMySQL 运行环境&#xff1a;Windows7以上、J…

Windows Server 2016 配置NTP客户端

目录 1. 前提条件1.1 进入服务管理界面1.2 开启Windows Time服务 2. 情况1&#xff1a;可以直接设置NTP时钟2.1 Internet时间设置 3. 情况2&#xff1a;有的版本服务器上没有“Internet时间”3.1 运行gpedit.msc 打开本地策略组3.2 Windows 时间服务3.3 配置Windows NTP客户端3…

Replidec:使用朴素贝叶斯分类器从宏基因组数据中识别病毒生命周期

Replidec - Use naive Bayes classifier to identify virus lifecycle from metagenomics data | bioRxivReplidec - Use naive Bayes classifier to identify virus lifecycle from metagenomics data | bioRxiv 安装 docker pull denglab/replidec 使用 for i in *_vOT…