每日一題,防止痴呆 = =假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
今天的每日一題是兩年前做過的一道題 = =,也是一道比較經典的dp吧,下面我按照官解給出的多個思路的目的,乙個個的說一下
思路一:動態規劃
這個肯定是可以用動態規劃求解的。我們令dp[i]表示爬i層台階共有多少種方法,那麼我們又知道每次只能爬1或2個台階,那麼dp[i] = dp[i-1] + dp[i-2],直接用dp解決即可,時間複雜度是o(n),然後我們發現其實這個dp只用到了三個數,所以空間複雜度就可以由o(n)優化到o(1)。
思路二:矩陣快速冪
我們發現,由上面提到的矩陣的遞推公式可以得到以下公式:
也就是說,我知道了f(0)和f(1)之後,我們可以通過不斷的乘乙個固定的矩陣來得到想要的f(n),那其實就是乙個求矩陣冪的問題,關於冪運算,我們是有快速冪的方法可以使得複雜度是o(logn)的,當然矩陣的乘法複雜度是o(1),然後空間複雜度也是o(1)。
思路三:直接用通項公式求解
這就是數學問題了,其實我們觀察遞推公式就可以發現,這個dp陣列其實就是乙個斐波那契數列,那麼我們就可以直接求通項公式,然後將n帶入求解,但這裡面會涉及到浮點數精度的問題,而且由於通項公式中含有冪次,所以時間複雜度還是o(logn),空間複雜度是o(1)。
ac**
這裡只將思路一中的dp寫一下,其實也就是在求斐波那契數列而已。
class
solution
return third;}}
;
leetcode70題 爬樓梯
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 2 階示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。3.1 階 1 階 1 階 4.1 階 2 階 5.2 階...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
每日一題 70 完全數計算
完全數 perfect number 又稱完美數或完備數,是一些特殊的自然數。它所有的真因子 即除了自身以外的約數 的和 即因子函式 恰好等於它本身。例如 28,它有約數1 2 4 7 14 28,除去它本身28外,其餘5個數相加,1 2 4 7 14 28。給定函式count int n 用於計算...