3.每日LeetCode-数组类,爬楼梯(Go,Java,Python)

发布于:2024-05-30 ⋅ 阅读:(106) ⋅ 点赞:(0)

目录

题目

解法

Go

Java

Python


代码地址:leetcode: 每日leetcode刷题

题目

题号70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

解法

Go

package main

import "fmt"


//方法一 递归 使用map求解出的结果不用重复求解
//满足公式
//F(1) = 1
//F(2) = 2
//F(n) = F(n-1) + F(n-2) (n>=2)
var mp = make(map[int]int)
func climbStairs1(n int) int {
	if n <= 2 {
		return n
	}
	if _, ok := mp[n]; ok {
		return mp[n]
	} else {
		rst := climbStairs1(n-1) + climbStairs1(n-2)
		mp[n] = rst
		return rst
	}
}

// 方法二 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
func climbStairs(n int) int {
	if n <= 2 {
		return n
	}
	rst := 0
	pre := 2
	prepre := 1
	for i := 3; i <= n; i++ {
		rst = pre + prepre
		prepre = pre
		pre = rst
	}
	return rst
}

func main() {
	fmt.Println(climbStairs(7))
}

Java

package org.example;

import java.util.HashMap;
import java.util.Map;

public class ClimbingStairs {

    // 方法一 递归 使用map求解出的结果不用重复求解
    // 满足公式
    // F(1) = 1
    // F(2) = 2
    // F(n) = F(n-1) + F(n-2) (n>=2)
    private Map<Integer, Integer> mp = new HashMap<Integer, Integer>();

    public int climbStairs1(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        if (null != mp.get(n)) {
            return mp.get(n);
        } else {
            int val = climbStairs1(n - 1) + climbStairs1(n - 2);
            mp.put(n, val);
            return val;
        }
    }

    // 方法二 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
    public int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }
        int rst = 0;
        int prepre = 1;
        int pre = 2;
        for (int i = 3; i <= n; i++) {
            rst = pre + prepre;
            prepre = pre;
            pre = rst;
        }
        return rst;
    }

    // 70. 爬楼梯
    public static void main(String[] args) {
        ClimbingStairs main = new ClimbingStairs();
        System.out.println(main.climbStairs(7));
    }

}

Python

# 方法一 递归 使用map求解出的结果不用重复求解
# 满足公式
# F(1) = 1
# F(2) = 2
# F(n) = F(n-1) + F(n-2) (n>=2)
dic = {}
def climbStairs1(n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    if n in dic:
        return dic[n]
    else:
        val = climbStairs1(n - 1) + climbStairs1(n - 2)
        dic[n] = val
        return val


# 方法二 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
def climbStairs(n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    count = 0
    prepre = 1
    pre = 2
    for i in range(3, n + 1):
        count = prepre + pre
        prepre = pre
        pre = count
    return count


if __name__ == '__main__':
    print(climbStairs(3))


网站公告

今日签到

点亮在社区的每一天
去签到