1. 程式人生 > 其它 >查詢演算法(中等)旋轉陣列的最小數字

查詢演算法(中等)旋轉陣列的最小數字

介紹

題目

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

題解

程式碼

書中

 1 #include <cstdio>
 2 #include <exception>
 3 
 4 int MinInOrder(int* numbers, int index1, int index2);
 5 
 6 int Min(int* numbers, int length)
 7 {
 8     if
(numbers == nullptr || length <= 0) 9 throw new std::exception("Invalid parameters"); 10 11 int index1 = 0; 12 int index2 = length - 1; 13 int indexMid = index1; 14 while(numbers[index1] >= numbers[index2]) 15 { 16 // 如果index1和index2指向相鄰的兩個數, 17 // 則index1指向第一個遞增子陣列的最後一個數字,
18 // index2指向第二個子陣列的第一個數字,也就是陣列中的最小數字 19 if(index2 - index1 == 1) 20 { 21 indexMid = index2; 22 break; 23 } 24 25 // 如果下標為index1、index2和indexMid指向的三個數字相等, 26 // 則只能順序查詢 27 indexMid = (index1 + index2) / 2; 28 if(numbers[index1] == numbers[index2] && numbers[indexMid] == numbers[index1])
29 return MinInOrder(numbers, index1, index2); 30 31 // 縮小查詢範圍 32 if(numbers[indexMid] >= numbers[index1]) 33 index1 = indexMid; 34 else if(numbers[indexMid] <= numbers[index2]) 35 index2 = indexMid; 36 } 37 38 return numbers[indexMid]; 39 } 40 41 int MinInOrder(int* numbers, int index1, int index2) 42 { 43 int result = numbers[index1]; 44 for(int i = index1 + 1; i <= index2; ++i) 45 { 46 if(result > numbers[i]) 47 result = numbers[i]; 48 } 49 50 return result; 51 }
View Code

https:/github.com/zhedahht/CodingInterviewChinese2/tree/master/11_MinNumberInRotatedArray