LeetCode程式設計題 每日1題

2021-10-14 18:54:17 字數 3347 閱讀 7650

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個 n 級的台階總共有多少種跳法。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

class

solution

return a;

}}

此類求 多少種可能性 的題目一般都有 遞推性質 ,即 f(n)f(n) 和 f(n-1)f(n−1)…f(1)f(1) 之間是有聯絡的。

設跳上 nn 級台階有 f(n)f(n) 種跳法。在所有跳法中,青蛙的最後一步只有兩種情況:跳上 1 級或 2 級台階。

當為 1級台階: 剩 n-1n−1 個台階,此情況共有 f(n-1)f(n−1) 種跳法;

當為 2 級台階: 剩 n-2n−2 個台階,此情況共有 f(n-2)f(n−2) 種跳法。

f(n)f(n) 為以上兩種情況之和,即 f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2) ,以上遞推性質為斐波那契數列。本題可轉化為求斐波那契數列第 nn 項的值,與 面試題10- i. 斐波那契數列 等價,唯一的不同在於起始數字不同。

青蛙跳台階問題: f(0)=1f(0)=1 , f(1)=1f(1)=1 , f(2)=2f(2)=2 ;

斐波那契數列問題: f(0)=0f(0)=0 , f(1)=1f(1)=1 , f(2)=1f(2)=1 。

動態規劃解析

迴圈求餘法

劍指 offer 10- i. 斐波那契數列

寫乙個函式,輸入 n ,求斐波那契(fibonacci)數列的第 n 項。斐波那契數列的定義如下:

f(0) = 0, f(1) = 1

f(n) = f(n - 1) + f(n - 2), 其中 n > 1.

斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

class

solution

return a;

}}

劍指 offer 11. 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 [3,4,5,1,2] 為 [1,2,3,4,5] 的乙個旋轉,該陣列的最小值為1。

class

solution

return numbers[i];}

}

演算法流程:

初始化: 宣告 ii, jj 雙指標分別指向 numsnums 陣列左右兩端;

迴圈二分:設 m = (i + j) / 2m=(i+j)/2 為每次二分的中點( 「/」 代表向下取整除法,因此恒有 i \leq m < ji≤m nums[j]nums[m]>nums[j] 時: mm 一定在 左排序陣列 中,即旋轉點 xx 一定在 [m + 1, j][m+1,j] 閉區間內,因此執行 i = m + 1i=m+1;

當 nums[m] < nums[j]nums[m]設以下兩個旋轉點值為 00 的示例陣列,則當 i = 0i=0, j = 4j=4 時 m = 2m=2 ,兩示例結果不同。

示例一 [1, 0, 1, 1, 1][1,0,1,1,1] :旋轉點 x = 1x=1 ,因此 m = 2m=2 在 右排序陣列 中。

示例二 [1, 1, 1, 0, 1][1,1,1,0,1] :旋轉點 x = 3x=3 ,因此 m = 2m=2 在 左排序陣列 中。

而證明 j = j - 1j=j−1 正確(縮小區間安全性),需分為兩種情況:

當 x < jx當 x = jx=j 時: 執行 j = j - 1j=j−1 後越過(丟失)了旋轉點 xx ,但最終返回的元素值 nums[i]nums[i] 仍等於旋轉點值 nums[x]nums[x] 。

由於 x = jx=j ,因此 nums[x] = nums[j] = nums[m] \leq number[i]nums[x]=nums[j]=nums[m]≤number[i] ;

又由於 i \leq m 此時,執行 j = j - 1j=j−1 後雖然丟失了旋轉點 xx ,但之後區間 [i, j][i,j] 只包含左排序陣列,二分下去返回的一定是本輪的 nums[i]nums[i] ,而其與 nums[x]nums[x] 相等。

4. 劍指 offer 26. 樹的子結構

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構)

b是a的子結構, 即 a中有出現和b相同的結構和節點值。

例如:給定的樹 a:

3

/ \

4 5

/ 1 2

給定的樹 b:4/

1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。

class

solution

boolean

recur

(treenode a, treenode b)

}

名詞規定:樹 aa 的根節點記作 節點 aa ,樹 bb 的根節點稱為 節點 bb 。

recur(a, b) 函式:

終止條件:

當節點 bb 為空:說明樹 bb 已匹配完成(越過葉子節點),因此返回 truetrue ;

當節點 aa 為空:說明已經越過樹 aa 葉子節點,即匹配失敗,返回 falsefalse ;

當節點 aa 和 bb 的值不同:說明匹配失敗,返回 falsefalse ;

返回值:

判斷 aa 和 bb 的左子節點是否相等,即 recur(a.left, b.left) ;

判斷 aa 和 bb 的右子節點是否相等,即 recur(a.right, b.right) ;

issubstructure(a, b) 函式:

特例處理: 當 樹 aa 為空 或 樹 bb 為空 時,直接返回 falsefalse ;

返回值: 若樹 bb 是樹 aa 的子結構,則必滿足以下三種情況之一,因此用或 || 連線;

以 節點 aa 為根節點的子樹 包含樹 bb ,對應 recur(a, b);

樹 bb 是 樹 aa 左子樹 的子結構,對應 issubstructure(a.left, b);

樹 bb 是 樹 aa 右子樹 的子結構,對應 issubstructure(a.right, b);

LeetCode 每日 1 題 打卡刷題計畫

活動頁面 佇列 隊首出,隊尾進 先進先出 queue 的基本操作有 q.push x 隊尾 d.push back x 隊尾 d.push front x 隊首 q.pop d.pop back d.pop front struct listnode vector操作push back 在陣列的最後...

每日程式設計(五) leetcode刷題

題目 最後乙個單詞的長度 描述 給定乙個僅包含大小寫字母和空格 的字串,返回其最後乙個單詞的長度。如果不存在最後乙個單詞,請返回 0 說明 乙個單詞是指由字母組成,但不包含任何空格的字串。示例 輸入 hello world 輸出 5分析 比較簡單了,很明顯字串的分割,去最後乙個字串,計算長度即可,但...

每日程式設計(十) leetcode刷題

題目 將有序陣列轉換為二叉搜尋樹 題目描述 將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示...