1. 程式人生 > >劍指offer11~20題

劍指offer11~20題

11. 旋轉陣列的最小數字

題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
解題思路:
題目中的“非減”的意思就是說前一個數要小於或者等於後一個數,不要理解成“非遞減”了。
二分法思想:
在一個有序陣列中查詢一個元素可以用二分查詢,二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性的演算法時間複雜度都為 O(logN)。

本題可以修改二分查詢演算法進行求解:

當 nums[m] <= nums[h] 的情況下,說明解在 [l, m] 之間,此時令 h = m;
否則解在 [m + 1, h] 之間,令 l = m + 1。
在這裡插入圖片描述
上面的解法如果遇到一個特殊情況還是可能會出問題,例如對於陣列 {1,1,1,0,1},滿足nums[l] == nums[m] == nums[h],l、m 和 h 指向的數都為 1,此時無法知道最小數字 0 在哪個區間。(解釋:相當於右邊的逐漸向上的最高峰等於左邊的逐漸向上的最高峰這種特殊情況時)
在這裡插入圖片描述

12. 矩陣中的路徑(筆者對這個題也有一些疑問)

題目描述:
請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑

。(解釋:只要存在這樣的路徑包含我們輸入的字串全部字元,就說明存在,否則不存在)路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。

例如下面的矩陣包含了一條 bfce 路徑。
在這裡插入圖片描述
詳情參考:
https://github.com/CyC2018/CS-Notes/blob/master/notes/劍指 offer 題解.md#12-矩陣中的路徑