春招刷题(2)

0329

of10.斐波那契数列

一道很基本的动态规划题目,但确实很能展现出应注意的点

比如直接使用递归本题会超出时间的限制

class Solution:
    def fib(self, n: int) -> int:
        if n < 2:
            return n
        else:
            # dp= [0] * (n+1)
            dp = [i for i in range(n+1)]
            dp[1] = dp[2] =1
            for i in range(3, n+1):
                dp[i] = dp[i-2] + dp[i-1]
            return dp[n] % 1000000007

使用动态规划可以很明显的减小计算复杂度,因为dp数组包含有记录的功能

746.最小花费爬楼梯

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0] * (len(cost))                         # 2.1初始化dp数组,本题对初始化没有什么特殊要求,直接初始化为0即可
        dp[0] = cost[0]                                # 2.2前两个楼梯要赋值初始化
        dp[1] = cost[1]                                # 2.3前两个楼梯要赋值初始化
        for i in range(2, len(cost)):                  # 4.动态规划如何遍历
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i]    # 3.递推公式
        return min(dp[len(cost)-1], dp[len(cost)-2])   # 1.确定dp数组的准确含义

开始体现出动态规划的一些基本点:确定dp数组含义,确定递推公式(即如何得到dp[i])、如何初始化dp数组、如何从初始化处开始向下遍历dp数组(与递推公式不同)。

dp[i]的定义是:到达第i个台阶所花费的最少体力为dp[i]

递推公式为:dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i],即由前1个或者前2个状态中的一个转化而来,选择较小的那个转化过来。cost[i]代表上这层楼那就一定会花费这层楼所需的代价。

初始化dp数组:自然是dp[0] = cost[0]; dp[1] = cost[1]

确定遍历过程:最后一步,递归公式有了,初始化有了,如何遍历呢?本题的遍历顺序其实比较简单,简单到可能忽略了思考这一步直接就把代码写出来了。因为是模拟台阶,而且dp[i]又dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
 

62.不同路径

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0 for i in range(n)] for j in range(m)]   # 初始化dp数组
        for i in range(m):                               # 所有行的第一个元素为1
            dp[i][0] = 1 
        for j in range(n):
            dp[0][j] = 1                                 # 所有列的第一个元素为1
        for i in range(1, m):                            # dp数组的遍历过程
            for j in range(1, n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]       # dp递推公式
        return dp[m-1][n-1]                              # 返回最后一个位置元素即是结果

开始接触机器人路径问题了,这是我之前很头疼的一类问题,确实也是最能体现动态规划思想的问题之一(还有背包问题)

机器人的路径问题是一个在二维范围内思考的问题

dp数组含义:直接从题目入手,dp[i][j]是从(0, 0)位置出发到(i, j)位置位置,有dp[i][j]条不同的路径

递推公式:dp[i][j]可以从两个方向推导过来,自然是dp[i][j] = dp[i-1][j] + dp[i][j-1]

dp数组初始化:dp[i][0] = dp[0][j] = 1,这其中包括了dp[0][0]的初始化为1,以及边界行和边界列一定为

确定遍历顺序:这里要看一下递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言面试八股文是指在春季招聘中常见的C语言相关的面试题目和知识点。下面是一份常见的C语言面试八股文,供您参考: 1. C语言的基本数据类型有哪些? C语言的基本数据类型包括整型、浮点型、字符型和指针型。 2. 请介绍一下C语言中的变量和常量。 变量是用来存储数据的内存位置,可以通过变量名来访问和修改其值。常量是指在程序执行过程中不会改变的值。 3. 什么是数组?请介绍一下C语言中的数组。 数组是一种存储相同类型数据的集合,通过索引来访问数组中的元素。在C语言中,数组的大小在定义时就需要确定,并且数组的下标从0开始。 4. 请介绍一下C语言中的指针。 指针是一个变量,其值为另一个变量的地址。通过指针可以直接访问和修改内存中的数据。使用指针可以提高程序的效率和灵活性。 5. 请介绍一下C语言中的函数。 函数是一段完成特定任务的代码块,可以通过函数名来调用执行。函数可以接收参数并返回一个值,也可以不接收参数或不返回值。 6. 请介绍一下C语言中的流程控制语句。 C语言中的流程控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。 7. 请介绍一下C语言中的结构体。 结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。通过结构体可以将多个相关的数据组织在一起。 8. 请介绍一下C语言中的文件操作。 C语言中的文件操作主要包括打开文件、读写文件和关闭文件。可以使用标准库函数来进行文件操作,如fopen、fread、fwrite、fclose等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白 AI 日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值