Skip to content

4道动态规划题 #6

@qjkobe

Description

@qjkobe

动态规划

动态规划问题是笔试常见题,看似很难,但其实只要多训练,就会发现这些题其实都有套路。据说小学生编程训练就已经做到动态规划了呢。 以下四道动态规划题选自leetcode中文社区中级算法动态规划一章。

跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例1

输入:[2,3,1,1,4]
输出:true
解释:从位置0到1跳1步,然后跳3步到达最后一个位置。

示例2

输入:[3,2,1,0,4]
输出:false
解释:无论怎样,你总会到达索引为3的位置,但该位置的最大跳跃长度是0。所以你永远不可能到达最后一个位置。

不同路径

一个机器人位于一个m x n网格的左上角(起始点在下图中标记位“Start”)。
机器人每次只能向下或者向右移动一步。机器人试图到达网格的右下角(在下图中标记位“Finish”)。
问总共有多少条不同的路径?

例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明: m和n的值均不超过100。
示例1:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有3条路径可以到达右下角。
1. 向右 - 向右 - 向下
2. 向右 - 向下 - 向右
3. 向下 - 向右 - 向右

示例2:

输入:m = 7, n = 3
输出:28

零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1
示例1:

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

示例2:

输入:coins = [2], amount = 3
输出:-1

说明:
你可以认为每种硬币的数量是无限的。

Longest Increasing Subsequence这题它没翻译

给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

说明:

  • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  • 你算法的时间复杂度应该为 O(n2) 。
    进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions