算法刷题 week4

2023-09-17 23:40:01

1.斐波那契数列

题目

在这里插入图片描述

题解
(递推 + 滚动变量) O(n)

这题的数据范围很小,我们直接模拟即可。
当数据范围很大时,就需要采用其他方式了,可以参考 求解斐波那契数列的若干方法

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

用两个变量滚动式得往后计算,a 表示第 n−1 项,b 表示第 n 项。
则令 c=a+b 表示第 n+1 项,然后让 a, b 顺次往后移一位。

时间复杂度分析

总共需要计算 n 次,所以时间复杂度是 O(n) ,但空间复杂度变成了 O(1)。

class Solution {
public:
    const int MOD = 1e9 + 7;    //1000000007
    int Fibonacci(int n) {
        int a = 0, b = 1;
        while (n--)  
        {
            int c = (a + b) % MOD;  //取模优先级比加减高,比乘数低
            a = b, b = c;   //逗号运算符,从左到右计算
        }
        return a;
    }
};  
//  	 0 1 1 2 3 5
//第几项  0 1 2 3 4 5 

剑指offer 10 - II 青蛙跳台阶问题

题目

在这里插入图片描述

题解

此类求 多少种可能性 的题目一般都有 递推性质 ,即 f(n) 和 f(n-1)…f(1) 之间是有联系的。

在这里插入图片描述

在这里插入图片描述

计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) ,所以时间复杂度是 O(n) 。

几个标志变量使用常数大小的额外空间,空间复杂度为 O(1)。

class Solution {
public:
    const int MOD = 1e9 + 7;    //1000000007
    int numWays(int n) {
        int a = 1, b = 1;   //只有起始条件不同,其它都与上题相同
        while (n--)  
        {
            int c = (a + b) % MOD;  //取模优先级比加减高,比乘数低
            a = b, b = c;   //逗号运算符,从左到右计算
        }
        return a;
    }
};

10.旋转数组的最小数字

题目

在这里插入图片描述

题解
(二分) O(n)

为了便于分析,我们先将数组中的数画在二维坐标系中,横坐标表示数组下标,纵坐标表示数值, 图中水平的实线段表示相同元素。如下所示:

2.png

我们发现除了最后水平的一段(黑色水平那段)之外,其余部分满足二分性质:竖直虚线左边的数满足 nums[i]≥nums[0];而竖直虚线右边的数不满足这个条件。

二分是二分性而不是单调性。只要满足可以找到一个值一半满足一半不满足即可,而不用满足单调性。

分界点就是整个数组的最小值,所以我们先将最后水平的一段删除即可。

另外,不要忘记处理数组完全单调的特殊情况:

当我们删除最后水平的一段之后,如果剩下的最后一个数大于等于第一个数,则说明数组完全单调。

时间复杂度分析

二分的时间复杂度是 O(logn),删除最后水平一段的时间复杂度最坏是 O(n),所以总时间复杂度是 O(n)。

class Solution
{
public:
    int findMin(vector<int>& nums)
    {
        int n = nums.size() - 1;
        if(n < 0) return -1;
        
        while (n > 0 && nums[n] == nums[0]) n--; //删除最后水平的一段,当n=0时,只有一个数,也要退出循环
        if (nums[n] >= nums[0]) return nums[0]; //当没有元素旋转时,则出现这种情况
        
        int l = 0, r = n;
        while (l < r) {
            int mid = l + r >> 1;  //[l, mid], [mid + 1, r]
		  	if (nums[mid] < nums[0]) r = mid;
            else l = mid + 1;
        }
        return nums[r];
    }
};
更多推荐

探索Go语言在机器学习领域的应用局限与前景

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Pytest系列-数据驱动@pytest.mark.parametrize(7)

简介unittest和pytest参数化对比:pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的而pytest框架:前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数,也可以用parametrize结合request来传

【linux】paramiko介绍 + 路由器设置tc命令使用

背景:要给网络灵活的设置各种带宽限制,通过对路由器下发tc命令实现。设置python脚本的ssh链接+tc脚本下发+针对某一个id进行配置。Paramiko是一个用于在Python中进行SSH(SecureShell)协议通信的库。它提供了在远程服务器上执行命令、上传和下载文件、建立SSH连接等功能,使得开发者可以轻松

MySQL---优化&日志

目录一、MySQL优化3、mysqlserver上的优化3.1、MySQL查询缓存3.2、索引和数据缓存3.2、线程缓存二、MySQL日志2.1、redolog重做日志2.2、undolog回滚日志2.3、错误日志2.4、查询日志2.5、二进制日志2.5.1、基于binlog数据恢复实践操作六、慢查询日志一、MySQL

渗透测试信息收集方法和工具分享

文章目录一、域名收集1.OneForAll2.子域名挖掘机3.subdomainsBurte4.ssl证书查询二、获取真实ip1.17CE2.站长之家ping检测3.如何寻找真实IP4.纯真ip数据库工具5.c段,旁站查询三、端口扫描1.端口扫描站长工具2.masscan(全端口扫描)+nmap扫描3.scanport

科大讯飞分类算法挑战赛2023的一些经验总结

引言:ResNet是hekaiming大佬的早年神作,当年直接刷榜各大图像分类任务。ResNet是一种残差网络,咱们可以把它理解为一个子网络,这个子网络经过堆叠可以构成一个很深的网络,而ResNext在其基础上,进行了一定修改完善,通过引入Cardinatity后,模型性能得到了大幅度提升。(下图是经典ResNet残差

知识图谱实战应用28-基于py2neo的ICD-11疾病分类的知识图谱的查询与问答实战应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用28-基于py2neo的ICD-11疾病分类的知识图谱的查询与问答实战应用。使用基于py2neo的ICD-11疾病分类知识图谱,我们能够像探索一座生物医学宇宙般,穿梭在各种疾病之间。这个神奇的图谱可以帮助我们揭示各种疾病之间复杂而微妙的联系。就像一位专业的侦探,我

【大数据】Neo4j 图数据库使用详解

目录一、图数据库介绍1.1什么是图数据库1.2为什么需要图数据库1.3图数据库应用领域二、图数据库Neo4j简介2.1Neo4j特性2.2Neo4j优点三、Neo4j数据模型3.1图论基础3.2属性图模型3.3Neo4j的构建元素3.3.1节点3.3.2属性3.3.3关系3.3.4标签四、Neo4j搭建过程4.1搭建步

泰安ITSS认证流程,认证条件

ITSS认证流程,认证条件一、ITSS的意义ITSS认证——信息技术服务标准,是在工业和信息化部、国家标准化委的领导和支持下,由ITSS工作组研制的一套IT服务领域的标准库和一套提供IT服务的方法论。ITSS认证-信息技术服务标准是一套成体系和综合配套的信息技术服务标准库,全面规范了IT服务产品及其组成要素,用于指导实

结构型模式-享元模式

主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建5个对象来画出20个分布于不同位置的圆来演示这种模式。由于只有5种可用的颜色,所以color属性

2-1 张量数据结构

张量概念张量是什么?单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor)。在深度学习中,标量、向量、矩阵、高维矩阵都统称为张量。在pytorch中,一个Tensor内部包含数据和导数两部分。Pytorch的基本数据结构是张量

热文推荐