1. 程式人生 > >LeetCode 746. Min Cost Climbing Stairs

LeetCode 746. Min Cost Climbing Stairs

題目大意: 有一段陣列,長度為nn,可以從第一步出發,也可以從第二部出發。可以一步一步走,也可以兩步兩步走。每次從一個地方離開時需要交錢。問需要的最小花費是多少。 思路其實很簡單,維護每一步的最小花費。走到ii步時,可以從i1i - 1步來的,也可以是i2i -2步來的。

  1. i1i - 1步來的,要交i1i - 1步的錢,就需要在i1i - 1步來的花費上加上i1i - 1步的錢。
  2. i2i - 2步來的,要交i2i - 2步的錢,就需要在i2i - 2步來的花費上加上i2i - 2步的錢。

比較以上兩個的大小,去最小值作為走到i

i步的最小花費。由於需要走出去,也就是要走到最後一步的還要後面一步,所以乾脆再加維護一個n+1n + 1步。最後時間複雜度O(N)O(N)。 這裡維護每一步的最小花費就有很多的資料結構了。比如陣列mincost[i]mincost[i],空間複雜度O(N)O(N)

int mincost[1005];
int length = cost.size() + 1;
mincost[0] = 0;
mincost[1] = 0;
for(int i = 2; i < length; i++){
    mincost[i] = min(mincost[i -
1] + cost[i - 1], mincost[i - 2] + cost[i - 2]); } return mincost[length - 1];

也有用vector維護的,空間複雜度O(N)O(N)

int n = cost.size();
vector<int> mincost(n+1,0);
        
for(int i=2; i<=n; i++){
     mincost[i] = min(mincost[i - 1] + cost[i - 1], mincost[i - 2] + cost[i - 2]);
}
return mincost[
n];

再比如只用三個變數儲存中間結果,空間複雜度O(1)O(1)

int mincost = 0, mincost1 = 0, mincost2 = 0;
int length = cost.size() + 1;
mincost1 = 0;
mincost2 = 0;
for(int i = 2; i < length; i++){
     mincost = min(mincost1 + cost[i - 1], mincost2 + cost[i - 2]);
     mincost2 = mincost1;
     mincost1 = mincost;
}
return mincost;

雖然時間複雜度都一樣,但是三個方法執行的時間不一樣,最快的是vector,用時4ms4ms;其次是陣列,用時8ms8ms,最慢的是三個變數,用時15ms15ms。 還望大神解釋!