2024-12-27:到达第 K 级台阶的方案数。用go语言,给定一个非负整数 k,我们有一个无限长度的台阶,从第 0 层开始编

举报
福大大架构师每日一题 发表于 2024/12/27 13:35:48 2024/12/27
【摘要】 2024-12-27:到达第 K 级台阶的方案数。用go语言,给定一个非负整数 k,我们有一个无限长度的台阶,从第 0 层开始编号。Alice 从第 1 层出发,并拥有一个初始值为 0 的变量 jump。她可以通过以下两种操作在台阶之间移动:1.向下移动到第 i - 1 层,但这个操作不能连续使用,且在第 0 层时无法再向下移动。2.向上移动到第 i + 2^jump 层,同时将 jump ...

2024-12-27:到达第 K 级台阶的方案数。用go语言,给定一个非负整数 k,我们有一个无限长度的台阶,从第 0 层开始编号。
Alice 从第 1 层出发,并拥有一个初始值为 0 的变量 jump。

她可以通过以下两种操作在台阶之间移动:

1.向下移动到第 i - 1 层,但这个操作不能连续使用,且在第 0 层时无法再向下移动。

2.向上移动到第 i + 2^jump 层,同时将 jump 的值增加 1。

Alice 的目标是到达第 k 层。请你计算她到达第 k 层的所有可能方案的数量。

需要注意的是,如果 Alice 在到达第 k 层后通过某些操作再次返回到 k 层,这也被视为一种不同的方案。

0 <= k <= 1000000000。

输入:k = 0。

输出:2。

解释:

2 种到达台阶 0 的方案为:

1.Alice 从台阶 1 开始。

1.1.执行第一种操作,从台阶 1 向下走到台阶 0 。

2.Alice 从台阶 1 开始。

2.1.执行第一种操作,从台阶 1 向下走到台阶 0 。

2.2.执行第二种操作,向上走 20 级台阶到台阶 1 。

2.3.执行第一种操作,从台阶 1 向下走到台阶 0 。

答案2024-12-27:

chatgpt

题目来自leetcode3154。

大体步骤如下:

1.使用动态规划来解决问题,定义一个函数 waysToReachStair 来计算到达第k级台阶的方案数。

2.在该函数中,根据 Alice 的移动规则,采用迭代的方式计算到达每一级台阶的方案数。

3.使用组合数的方式,计算不同移动方式的组合数,更新方案数。

4.返回到达第k级台阶的所有可能方案的数量。

时间复杂度分析:

  • 由于需要进行迭代计算每一级台阶的方案数,时间复杂度为 O(log k)。

空间复杂度分析:

  • 算法使用了常数级别的额外空间,主要用于变量和存储计算结果,因此空间复杂度为 O(1)。

Go完整代码如下:

package main

import (
	"fmt"
)

func waysToReachStair(k int) int {
	n, npow, ans := 0, 1, 0
	for {
		if npow-n-1 <= k && k <= npow {
			ans += comb(n+1, npow-k)
		} else if npow-n-1 > k {
			break
		}
		n++
		npow *= 2
	}
	return ans
}

func comb(n, k int) int {
	ans := 1
	for i := n; i >= n-k+1; i-- {
		ans *= i
		ans /= n - i + 1
	}
	return ans
}

func main() {
	k := 0
	fmt.Println(waysToReachStair(k))
}

在这里插入图片描述

Rust完整代码如下:

fn ways_to_reach_stair(k: i32) -> i32 {
    let mut n = 0;
    let mut npow = 1;
    let mut ans = 0;
    
    loop {
        if npow - n - 1 <= k && k <= npow {
            ans += comb(n + 1, npow - k);
        } else if npow - n - 1 > k {
            break;
        }
        n += 1;
        npow *= 2;
    }

    ans
}

fn comb(n: i32, k: i32) -> i32 {
    let mut ans = 1;
    
    for i in n..=n-k+1 {
        ans *= i;
        ans /= n - i + 1;
    }

    ans
}

fn main() {
    let k = 0;
    println!("{}", ways_to_reach_stair(k));
}

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。