力扣第70、83題
70、爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
- 1 階 + 1 階
- 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
- 1 階 + 1 階 + 1 階
- 1 階 + 2 階
- 2 階 + 1 階
解題思路:
本問題其實常規解法可以分成多個子問題,爬第n階樓梯的方法數量,等於 2 部分之和
1. 爬上 n-1n−1 階樓梯的方法數量。因爲再爬1階就能到第n階
2. 爬上 n-2n−2 階樓梯的方法數量,因爲再爬2階就能到第n階
3. 所以我們得到公式 dp[n] = dp[n-1] + dp[n-2]dp[n]=dp[n−1]+dp[n−2]
4. 同時需要初始化 dp[0]=1dp[0]=1 和 dp[1]=1dp[1]=1
5. 時間複雜度:O(n)O(n)
代碼:
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
83題、刪除順序鏈表中的重複元素
給定一個排序鏈表,刪除所有重複的元素,使得每個元素只出現一次。
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:
輸入: 1->1->2->3->3
輸出: 1->2->3
解題思路:
這個題相對來說還是比較簡單的,只要你學過數據結構中的鏈表,這是對於鏈表的刪除操作,我們來看看怎麼解決。
1. 我們先創建出來一個頭指針,當滿足頭指針不空,而且鏈表不空的條件時,我們就可以進行下一步的操作
2. 判斷當頭指針所在的位置的元素等於下一個元素時,我們新創建一個指針,讓該節點的下一個節點賦給頭結點的下一個節點,這樣再次循環時,頭結點就已經往後移動了,當賦值完成後,別忘了清除野指針。
代碼:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode cur = head;
while(cur != null && cur.next != null){
if(cur.val == cur.next.val){
ListNode node = cur.next;
cur.next = node.next;
node.next = null;//清除野指針
}else{
cur = cur.next;
}
}
return head;
}
}