力扣第70、83題

力扣第70、83題

70、爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

示例 1:

輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。

  1. 1 階 + 1 階
  2. 2 階

示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。

  1. 1 階 + 1 階 + 1 階
  2. 1 階 + 2 階
  3. 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;
    }
}

關注公衆號:奈斯雜文,菜鳥小謝帶你學習java和算法

1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章