返回介绍

solution / 0700-0799 / 0746.Min Cost Climbing Stairs / README_EN

发布于 2024-06-17 01:03:34 字数 6179 浏览 0 评论 0 收藏 0

746. Min Cost Climbing Stairs

中文文档

Description

You are given an integer array cost where cost[i] is the cost of ith step on a staircase. Once you pay the cost, you can either climb one or two steps.

You can either start from the step with index 0, or the step with index 1.

Return _the minimum cost to reach the top of the floor_.

 

Example 1:

Input: cost = [10,15,20]
Output: 15
Explanation: You will start at index 1.
- Pay 15 and climb two steps to reach the top.
The total cost is 15.

Example 2:

Input: cost = [1,100,1,1,1,100,1,1,100,1]
Output: 6
Explanation: You will start at index 0.
- Pay 1 and climb two steps to reach index 2.
- Pay 1 and climb two steps to reach index 4.
- Pay 1 and climb two steps to reach index 6.
- Pay 1 and climb one step to reach index 7.
- Pay 1 and climb two steps to reach index 9.
- Pay 1 and climb one step to reach the top.
The total cost is 6.

 

Constraints:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

Solutions

Solution 1: Dynamic Programming

We define $f[i]$ as the minimum cost required to reach the $i$th step, initially $f[0] = f[1] = 0$. The answer is $f[n]$.

When $i \ge 2$, we can directly reach the $i$th step from the $(i - 1)$th step using $1$ step, or reach the $i$th step from the $(i - 2)$th step using $2$ steps. Therefore, we have the state transition equation:

$$ f[i] = \min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]) $$

The final answer is $f[n]$.

The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the cost array.

We notice that $f[i]$ in the state transition equation is only related to $f[i - 1]$ and $f[i - 2]$. Therefore, we can use two variables $f$ and $g$ to alternately record the values of $f[i - 2]$ and $f[i - 1]$, which optimizes the space complexity to $O(1)$.

class Solution:
  def minCostClimbingStairs(self, cost: List[int]) -> int:
    n = len(cost)
    f = [0] * (n + 1)
    for i in range(2, n + 1):
      f[i] = min(f[i - 2] + cost[i - 2], f[i - 1] + cost[i - 1])
    return f[n]
class Solution {
  public int minCostClimbingStairs(int[] cost) {
    int n = cost.length;
    int[] f = new int[n + 1];
    for (int i = 2; i <= n; ++i) {
      f[i] = Math.min(f[i - 2] + cost[i - 2], f[i - 1] + cost[i - 1]);
    }
    return f[n];
  }
}
class Solution {
public:
  int minCostClimbingStairs(vector<int>& cost) {
    int n = cost.size();
    vector<int> f(n + 1);
    for (int i = 2; i <= n; ++i) {
      f[i] = min(f[i - 2] + cost[i - 2], f[i - 1] + cost[i - 1]);
    }
    return f[n];
  }
};
func minCostClimbingStairs(cost []int) int {
  n := len(cost)
  f := make([]int, n+1)
  for i := 2; i <= n; i++ {
    f[i] = min(f[i-1]+cost[i-1], f[i-2]+cost[i-2])
  }
  return f[n]
}
function minCostClimbingStairs(cost: number[]): number {
  const n = cost.length;
  const f: number[] = Array(n + 1).fill(0);
  for (let i = 2; i <= n; ++i) {
    f[i] = Math.min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]);
  }
  return f[n];
}
impl Solution {
  pub fn min_cost_climbing_stairs(cost: Vec<i32>) -> i32 {
    let n = cost.len();
    let mut f = vec![0; n + 1];
    for i in 2..=n {
      f[i] = std::cmp::min(f[i - 2] + cost[i - 2], f[i - 1] + cost[i - 1]);
    }
    f[n]
  }
}

Solution 2

class Solution:
  def minCostClimbingStairs(self, cost: List[int]) -> int:
    f = g = 0
    for i in range(2, len(cost) + 1):
      f, g = g, min(f + cost[i - 2], g + cost[i - 1])
    return g
class Solution {
  public int minCostClimbingStairs(int[] cost) {
    int f = 0, g = 0;
    for (int i = 2; i <= cost.length; ++i) {
      int gg = Math.min(f + cost[i - 2], g + cost[i - 1]);
      f = g;
      g = gg;
    }
    return g;
  }
}
class Solution {
public:
  int minCostClimbingStairs(vector<int>& cost) {
    int f = 0, g = 0;
    for (int i = 2; i <= cost.size(); ++i) {
      int gg = min(f + cost[i - 2], g + cost[i - 1]);
      f = g;
      g = gg;
    }
    return g;
  }
};
func minCostClimbingStairs(cost []int) int {
  var f, g int
  for i := 2; i <= n; i++ {
    f, g = g, min(f+cost[i-2], g+cost[i-1])
  }
  return g
}
function minCostClimbingStairs(cost: number[]): number {
  let a = 0,
    b = 0;
  for (let i = 1; i < cost.length; ++i) {
    [a, b] = [b, Math.min(a + cost[i - 1], b + cost[i])];
  }
  return b;
}
impl Solution {
  pub fn min_cost_climbing_stairs(cost: Vec<i32>) -> i32 {
    let (mut f, mut g) = (0, 0);
    for i in 2..=cost.len() {
      let gg = std::cmp::min(f + cost[i - 2], g + cost[i - 1]);
      f = g;
      g = gg;
    }
    g
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文