假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?实现 int sqrt(int x) 函数。

本文探讨了两种经典算法问题:一是求解爬楼梯的不同方法数量,通过斐波那契数列实现;二是计算非负整数的平方根,采用迭代查找的方法。文章提供了C语言的实现代码。

今天我们来爬一爬楼梯。
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

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

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

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶
其实多数几组你就会发现规律
一阶楼梯:1种方法
两阶楼梯:2种方法
三阶楼梯:3种方法
四阶楼梯:5种方法
五阶楼梯:8种方法
六阶楼梯:13种方法
朋友们应该看出来了有规律了 这不就是斐波那契数列么,只不过缺少第一项而已。(斐波那契数列我在前面的博客中写过,大家可以去看下。)
好。那接下来就可以写代码了

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
int climbStairs(int n) {

	int num1 = 1;
	int num2 = 2;
	int tep = 0;
	if (n <= 2)
	{
		return n;
	}
	else
	{
		for (int i = 2; i < n; i++)//从第三项开始, 第i项等于第i-1项加第i-2项
		{
			tep = num1 + num2;
			num1 = num2;
			num2 = tep;
		}
		return tep;
	}

}
int main()
{
	int n = 0;
	printf("请输入一个正整数->");
	scanf("%d", &n);
	int a = climbStairs(n);

	printf("%d\n", a);
	system("pause");
	return 0;
}

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入 : 4
输出 : 2
示例 2 :

输入 : 8
输出 : 2
说明 : 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
我的想法就是当一个整数大于三的时候,那么这个数一半的平方肯定是大于等于这个数,所以我们只需要在0—n/2之间找到一个数,它的平方小于等于n,它加一的平方大于n就行了。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int mySqrt(int x) {
	if (x>1)
	{
		for (int i = 1; i <= x / 2; i++)
		{
			if ((i <= x / 2) && ((i + 1)>x / (i + 1)))
			{
				return i;
			}
		}
	}
	return x;
}
int main()
{
	int n = 0;
	printf("请输入一个正整数->");
	scanf("%d", &n);
	int a=mySqrt(n);
	//int a = climbStairs(n);

	printf("%d\n", a);
	system("pause");
	return 0;
}
<think>首先,用户的问题是关于爬楼梯问题的动态规划解法,包括算法实现方法数计算。用户提供了几个引用,我需要参考这些引用,但记住引用不是用户真实需求,而是背景信息。用户上一次的问题和我的回答没有被提供,所以我只能基于当前查询。 用户查询:"我想计算爬楼梯不同方法数,涉及算法和动态规划问题 请问爬楼梯问题 动态规划解法 算法实现 方法数计算" 关键点: - 爬楼梯问题:经典的动态规划问题,涉及计算爬到第n楼梯的方法数,每次可以12。 - 需要提供动态规划解法、算法实现方法数计算。 系统级指令: - 所有行内数学表达式必须使用$...$格式,例如:$x^2$。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户可见层: - 回答结构清晰,逐步解决问题。 参考引用: - [^1]: 经典动态规划问题:爬楼梯的多种解法详解。问题描述:爬到第n楼梯的方法数。 - [^2]: 动态规划求解:定义状态$dp[i]$表示爬到第i方法总数。状态转移方程:$dp[i] = dp[i-1] + dp[i-2]$ for $i > 2$,初始化$dp[0] = 1$, $dp[1] = 1$。 - [^3]: LeetCode 70题,从递归到动态规划的路径。 - [^4]: Java实现,动态规划思路:拆分问题。 - [^5]: 动态规划公式:$dp[i] = dp[i-1] + dp[i-2]$,边界$dp[1]=1, dp[2]=2$,空间优化使用滚动数组。 我的回答需要基于这些引用,但添加引用标识。 结构回答: 1. **问题描述**:清晰描述爬楼梯问题。 2. **动态规划解法**:解释状态定义、状态转移方程、初始化、求解目标。 3. **算法实现**:提供代码示例,可能用PythonJava(引用中有Java)。 4. **方法数计算**:讨论如何计算具体值。 5. **生成相关问题**:在末尾添加相关问题。 步骤: - 先描述问题。 - 然后动态规划解法,使用数学表达式。 - 接着算法实现。 - 最后相关问题。 数学表达式: - 行内:如$dp[i]$ - 独立:如状态转移方程。 确保中文回答。 生成相关问题:类似示例,基于爬楼梯问题。 最终回答结构: 1. 问题描述 2. 动态规划解法 3. 算法实现 4. 方法数计算 5. 相关问题</think>### 爬楼梯问题的动态规划解法 爬楼梯问题是一个经典的算法问题,常用于动态规划教学。问题描述如下:假设正在爬楼梯每次你可以 1 2 。问爬到第 $n$ 楼梯有多少不同方法?例如: - 当 $n = 1$ 时,只有 1方法 1 )。 - 当 $n = 2$ 时,有 2方法 1 两次直接 2 )。 - 当 $n = 3$ 时,有 3 种方法1+1+1, 1+2, 2+1)[^1]。 #### 动态规划解法 动态规划通过将问题分解为子问题来高效求解。核心思路是: - **状态定义**:设 $dp[i]$ 表示爬到第 $i$ 楼梯的方法总数。 - **状态转移方程**:由于每次只能 1 2 爬到第 $i$ 方法数等于从第 $i-1$ 1 方法数加上从第 $i-2$ 2 方法数。因此,方程如下: $$dp[i] = dp[i-1] + dp[i-2] \quad \text{当} \quad i \geq 2$$ - **初始化**: - $dp[0] = 1$(没有楼梯时视为一种方法,即“不”)。 - $dp[1] = 1$(只有一楼梯时,只有一种方法)。 - **求解目标**:计算 $dp[n]$,即为爬到第 $n$ 方法总数[^2][^5]。 这种方法的时间复杂度为 $O(n)$(遍历一次楼梯数),空间复杂度为 $O(n)$(存储 dp 数组)。但可以通过空间优化(如滚动数组)将空间复杂度降至 $O(1)$[^3][^5]。 #### 算法实现 以下是 Python 实现,使用动态规划计算爬楼梯方法数。代码包括空间优化(滚动数组),空间复杂度为 $O(1)$: ```python def climb_stairs(n: int) -> int: if n <= 2: return n # 边界情况:n=1 返回 1, n=2 返回 2 dp0, dp1 = 1, 1 # 初始化:dp[0] 和 dp[1] for i in range(2, n + 1): dp_current = dp0 + dp1 # 状态转移:dp[i] = dp[i-1] + dp[i-2] dp0, dp1 = dp1, dp_current # 滚动更新:dp0 为 dp[i-1], dp1 为 dp[i] return dp1 # 示例计算 n = 5 print(f"爬到第 {n} 楼梯的方法数:{climb_stairs(n)}") # 输出:8 ``` 代码说明: - 初始化 `dp0` 和 `dp1` 对应 $dp[0]$ 和 $dp[1]$。 - 循环从 $i=2$ 到 $i=n$,计算 $dp[i]$ 并滚动更新值。 - 最终返回 `dp1`(即 $dp[n]$)。 - 例如,$n=5$ 时,方法数为 8(序列如:1+1+1+1+1, 2+2+1, 等)[^2][^5]。 #### 方法数计算 方法数的计算依赖于状态转移方程: - **基础值**: - $dp[0] = 1$ - $dp[1] = 1$ - **递推计算**: - $dp[2] = dp[1] + dp[0] = 1 + 1 = 2$ - $dp[3] = dp[2] + dp[1] = 2 + 1 = 3$ - $dp[4] = dp[3] + dp[2] = 3 + 2 = 5$ - $dp[5] = dp[4] + dp[3] = 5 + 3 = 8$ - **规律**:方法数序列为斐波那契数列(1, 1, 2, 3, 5, 8, ...),其中 $dp[n]$ 对应斐波那契数的第 $n+1$ 项(索引从 0 开始)[^1][^3]。 对于任意 $n$,计算 $dp[n]$ 只需 $O(n)$ 时间,使用上述代码即可高效得出结果。 #### 总结 动态规划解法通过子问题重叠和状态转移,避免了递归的指数级复杂度(如暴力递归的 $O(2^n)$),将问题优化为线性时间和常数空间[^3][^4]。实际应用中,爬楼梯问题常用于算法面试(如 LeetCode 70题)和组合数学教学[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值