LeetCode 746. Min Cost Climbing Stairs
阿新 • • 發佈:2018-12-10
題目大意: 有一段陣列,長度為,可以從第一步出發,也可以從第二部出發。可以一步一步走,也可以兩步兩步走。每次從一個地方離開時需要交錢。問需要的最小花費是多少。 思路其實很簡單,維護每一步的最小花費。走到步時,可以從步來的,也可以是步來的。
- 從步來的,要交步的錢,就需要在步來的花費上加上步的錢。
- 從步來的,要交步的錢,就需要在步來的花費上加上步的錢。
比較以上兩個的大小,去最小值作為走到步的最小花費。由於需要走出去,也就是要走到最後一步的還要後面一步,所以乾脆再加維護一個步。最後時間複雜度。 這裡維護每一步的最小花費就有很多的資料結構了。比如陣列,空間複雜度:
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維護的,空間複雜度:
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];
再比如只用三個變數儲存中間結果,空間複雜度:
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,用時;其次是陣列,用時,最慢的是三個變數,用時。 還望大神解釋!