查詢演算法(中等)旋轉陣列的最小數字
阿新 • • 發佈:2021-10-10
介紹
題目
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如,陣列[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 ifView Code(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 }
https:/github.com/zhedahht/CodingInterviewChinese2/tree/master/11_MinNumberInRotatedArray