Leetcode-动态规划

70. 爬楼梯 https://leetcode-cn.com/problems/climbing-stairs/

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

解:

暴力,如果只有一阶,就只有一种方法;如果只有二阶,就只有两种方法。那么n阶的方法数就等于n-1阶和n-2阶方法数之和。但直接递归,有太多重复计算,超时。O(2n)

class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        return self.climbStairs(n-1) + self.climbStairs(n-2)

递归+记忆化,放数组里缓存。把每一步的结果存储在 memo 数组之中,每当函数再次被调用,就直接从 memo 数组返回结果

class Solution:
    def climbStairs(self, n: int) -> int:
        memo = [0]*(n+1)  # memo[i]表示从第i阶到第n阶的方法数,出发点是第0阶

        def helper(i, n, memo):  # 起始点i,终点n
            if i > n:  # 越界,最高起点直接在第n阶
                return 0
            if i == n:   # 不用动,一种方法
                return 1

            if memo[i] > 0:
                return memo[i]  # 如果已经算过了,就不用再算了

            memo[i] = helper(i+1, n, memo) + helper(i+2, n, memo)

            return memo[i]

        return helper(0, n, memo)

    

动态规划,递推, f(n) = f(n-1) + f(n-2) ,f(1)=1 , f(2)=2。O(N)  其实也可以不用开一个数组。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n

        f = [0]*n
        f[0], f[1] = 1, 2
        for i in range(2, n):
            f[i] = f[i-1]+ f[i-2]
        return f[n-1]
# O(1) 空间
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n

        pre1 = 1
        pre2 = 2
        for i in range(2, n):
            cur = pre1 + pre2

            pre1 = pre2
            pre2 = cur

        return cur

  

Binets 矩阵乘法

特征根

120.三角形最小路径和 https://leetcode-cn.com/problems/triangle/

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

原文地址:https://www.cnblogs.com/chaojunwang-ml/p/11365562.html

时间: 2024-07-29 04:08:25

Leetcode-动态规划的相关文章

Leetcode 动态规划 Decode Ways

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Decode Ways Total Accepted: 8689 Total Submissions: 55465 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 Given a

Leetcode 动态规划 Maximum Subarray

正整数或一位小数或者俩位小数的正则表达式的写法 ^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$ Leetcode 动态规划 Maximum Subarray,布布扣,bubuko.com

Leetcode 动态规划 Climbing Stairs

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Climbing Stairs Total Accepted: 13319 Total Submissions: 40778 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinc

Leetcode动态规划【简单题】

目录 Leetcode动态规划[简单题] 53. 最大子序和 题目描述 思路分析 复杂度分析 70.爬楼梯 题目描述 思路分析 复杂度分析 121.买卖股票的最佳时机 题目描述 思路分析 复杂度分析 303.区域和检索-数组不可变 题目描述 思路分析 复杂度分析 Leetcode动态规划[简单题] 动态规划(Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法.动态规划相较于递归,拥有更少的计算量. 53. 最大子序和 题目描述 给定一

快速上手leetcode动态规划题

快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了解到动态规划是“带有备忘录的递归”, 而大多数用来理解动态规划的例子都是斐波那契数列,就是那个经典的递归式 f(i)=f(i-1)+f(i-2) ,f(1)=f(2)=1 那么我们就可以得到很多式子,比如求f(5): f(5)=f(4)+f(3); f(4)=f(3)+f(2); f(3)=f(2)

[LeetCode] 动态规划入门题目

最近接触了动态规划这个厉害的方法,还在慢慢地试着去了解这种思想,因此就在LeetCode上面找了几道比较简单的题目练了练手. 首先,动态规划是什么呢?很多人认为把它称作一种"算法",其实我认为把它称作一种"思想"更为合适:利用动态规划去解决问题,其实就是逐步递推的过程,与贪心算法不同,动态规划递推的每一步都要求是当前的最优解(这是很重要的,递推的正确性依赖的就是这一点):利用动态规划解题时,必须自己定义出来状态和状态转移方程.然而,看上去简单,做起来却非常困难,因为

&lt;LeetCode&gt;动态规划——Two Sequences 类型题目

一.类型描述 Two Sequences 的题目一般会提供两个sequence,一般问最大/最小.true/false.count(*)这几类的问题. 其中,Two Sequences的动态规划题目的四要素: state:dp[i][j] 一般表示 第一个sequence的前i个字符 和 第二个sequence的前j个字符 怎么怎么样. Initialization: 这类型动态规划一般初始化dp数组的方式是根据题目的含义初始化第一行和第一列. function:解决动态规划的function问

LeetCode动态规划题总结【持续更新】

以下题号均为LeetCode题号,便于查看原题. 10. Regular Expression Matching 题意:实现字符串的正则匹配,包含'.' 和 '*'.'.' 匹配任意一个字符,"*" 匹配 '*' 之前的0个或多个字符. example: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa",&

【Leetcode 动态规划】 不知如何分类 就都放这里了

338. Counting Bits Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array. Example: For num = 5 you should return [0,1,1,2,1,2]. 意思是

leetcode 动态规划整理

动态规划整理 1.最长公共子序列 # 给定两个字符串?text1 和?text2,返回这两个字符串的最长公共子序列. # # 一个字符串的?子序列?是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串. # 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" # 的子序列.两个字符串的「公共子序列」是这两个字符串所共同拥有的子