日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer--旋转数组的最小数字

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer--旋转数组的最小数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄來自《劍指offer》上的算法題。

題目描述如下:

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

這里可以采用二分查找的想法,使用兩個指針,一個指向第一個元素,一個指向末尾元素,然后就需要尋找數組的中間元素,如果中間元素是位于前面的遞增序列,則指向第一個元素的指針指向中間元素,從而縮小范圍,否則中間元素就是位于后面的遞增序列,然后讓第二個指針指向這個中間元素。然后判斷兩個指針是否剛好是相鄰,即相減是否為一,如果是,就結束尋找,然后第二個指針指向的元素就是需要尋找的最小值,否則再繼續尋找中間元素,重復上述步驟。

實現代碼如下:

// 尋找旋轉數組的最小值 int Min(int* numbers, int length){if (numbers == NULL || length <= 0){throw new std::exception("Invaild parameters.\n");}int index1 = 0;int index2 = length - 1;int indexMid = index1;while (numbers[index1] >= numbers[index2]){if (index2 - index1 == 1){indexMid = index2;break;}indexMid = (index1 + index2) / 2;// 如果下標為index1,index2和indexMid指向的數字都相等,只能使用順序查找if (numbers[index1] == numbers[index2]&& numbers[index1] == numbers[indexMid])return MinInOrder(numbers, index1, index2);if (numbers[indexMid] > numbers[index1])index1 = indexMid;else if (numbers[indexMid] <= numbers[index2])index2 = indexMid;}return numbers[indexMid];} // 順序查找 int MinInOrder(int* numbers, int index1, int index2){int result = numbers[index1];for (int i = index1 + 1; i < index2; i++){if (result>numbers[i])result = numbers[i];}return result; } // 測試 int main(void){// 升序排序數組的一個選擇數組int a1[5] = { 3, 4, 5, 1, 2 };cout << "min = " << Min(a1, 5) << endl;// 有重復數字int a2[5] = { 3, 4, 5, 1, 1 };cout << "min = " << Min(a2, 5) << endl;// 升序排序數組int a3[5] = { 2, 3, 4, 5, 6 };cout << "min = " << Min(a3, 5) << endl;// 只有一個數字int a4[1] = { 4 };cout << "min = " << Min(a4, 1) << endl;// 特例測試int a5[5] = { 1, 0, 1, 1, 1 };cout << "min = " << Min(a5, 5) << endl;int a6[] = { 1, 1, 1, 0, 1 };cout << "min = " << Min(a6, 5) << endl;system("pause");return 0; }

這里需要注意一種特例,就是當兩個指針指向的元素和中間元素都相等,那么此時只能采用順序查找,因為此時是無法判斷中間的數字是位于前面還是后面的子序列中。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的剑指offer--旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。