No70.爬樓梯
1.題目
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階
3.
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
4. 1 階 + 1 階 + 1 階
5. 1 階 + 2 階
6. 2 階 + 1 階
2.算法思路
不難發現樓梯階數與方法數的關係滿足費布拉切數列
樓梯階數1 2 3 4 5 ...
方法數 1 2 3 5 8 ...
3.算法代碼
class Solution {
public int climbStairs(int n) {
if(n <= 3){
return n;
}
int result = 0;
int ll = 2; //左左節點
int l=3; //左節點
for(int i=3;i<n;i++){
result = ll+l;
ll = l;
l = result;
}
return result;
}
}
No83.刪除排序鏈表中的重複元素
1.題目
給定一個排序鏈表,刪除所有重複的元素,使得每個元素只出現一次。
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:
輸入: 1->1->2->3->3
輸出: 1->2->3
2.算法思路
每次衝鏈表中拿到頭元素,然後和它後面的一個元素(如果有的話)比較。
- 若頭元素的值和它後一個元素的值相等,則把它後面的那個節點刪除(temp.next = temp.next.next)
- 若不相等,則繼續判斷鏈表的下一個節點。
3.算法代碼
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode temp = head;
while(temp != null && temp.next != null){ //後面一個節點要存在
if(temp.val == temp.next.val){ //步驟1:相等的情況
temp.next = temp.next.next;
}else{ //步驟2:不相等的情況
temp = temp.next;
}
}
return head;
}
}