0918畅行智能
第一题青蛙爬楼梯(leetcode 70)
简单分析就是个斐波拉契数列
class Solution {
public:
// n是一个正整数
//本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和
//爬上 n-1n−1 阶楼梯的方法数量。因为再爬1阶就能到第n阶
//爬上 n-2n−2 阶楼梯的方法数量,因为再爬2阶就能到第n阶
int climbStairs(int n) {
if(n<=2){
return n;
}
// base case
//因为n是需要我们求的变量,也就是第n阶个楼梯, 而对于数组来说就是dp[n]所以数组的size为n+1
vector<int> dp(n+1); // 我个人是不建议为f[0]设置值的,循环里面应该从3开始。 题目说到了n是一个正整数
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n; i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
第二题 55. 跳跃游戏
主要思路:
见题解
调用递归树:
根据所画的递归树代码如下:
class Solution
{
public:
bool canJump(vector<int> &nums)
{
if (0 == nums.size())
return false;
return dfs(0, nums);
}
bool dfs(int index, vector<int> &nums)
{
//递归的终止条件
if (index >= nums.size() - 1)
{
return true;
}
//根据nums[index]表示要循环多少次,index是当前我们能到达的位置
//在这个基础上有 index+1,index+2.... index+i=nums[index]种跳跃选择
for (int i = 1; i <= nums[index]; i++)
{
# index+i为新的index
if (dfs(index+i, nums))
{
return true;
}
}
return false;
}
};
超时,那么加memo, 比较特殊memo用unordered_map
class Solution
{
public:
bool canJump(vector<int> &nums)
{
if (0 == nums.size())
return false;
unordered_map<int, bool> memo;
return dfs(0, nums, memo);
}
bool dfs(int index, vector<int> &nums,unordered_map<int, bool>& memo)
{
//递归的终止条件
if (index >= nums.size() - 1)
{
return true;
}
// if memo里面有这个f(i)的值直接返回
//if(cache.containsKey(index))
if(memo.find(index)!=memo.end()){
return memo[index];
}
//根据nums[index]表示要循环多少次,index是当前我们能到达的位置
//在这个基础上有 index+1,index+2.... index+i=nums[index]种跳跃选择
for(int i=1; i<=nums[index];i++){
if(dfs(index+i, nums, memo)){
memo[index]=true;
return true;
}
}
memo[index]=false;
return false;
}
};
用这个方法比较好理解:(贪心大法好)[https://leetcode-cn.com/problems/jump-game/solution/tan-xin-cong-qian-wang-hou-tiao-cong-hou-wang-qian/]
bool canJump(vector<int> &nums)
{
int start =0;
int end=0;
while(start<=end && end<nums.size()-1){
end=max(end, nums[start]+start);
start++;
}
return end>=nums.size()-1;
}
类似的题: