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

2021-09-21 01:12:17 字數 1475 閱讀 3740

1.旋轉陣列的最小數字

題目內容:

**及思路:

一開始能想到的方法兩種,1)直接從頭開始遍歷陣列,那麼複雜度是o(n);2)這種方法更想不開了,直接用快排對陣列排序一下,那麼複雜度就變成o(nlogn)了。然後其實基於第二種排序的思想可以利用二分查詢的方法,就得到了第三種方法。3)二分查詢。

我們首先觀察陣列情況,旋轉後的陣列滿足這樣乙個特徵,陣列分為兩個帶序的子陣列,且前面的子陣列都大於等於後面的子陣列。題目需要的最小元素恰好是兩個陣列的分界位置。利用二分法的思路,首先在陣列的頭和尾設定兩個指標index1和index2,且尋找中間元素位置indexmid。如果indexmid位於第乙個陣列中,則表示該元素的數值大於在indexmid之前的元素,因此可以將index1的位置替換成indexmid的位置,那麼最小元素應該在indexmid與index2中間,這樣替換之後就可以縮小了尋找範圍。以此類推,如果indexmid在第二個陣列當中,則該位置元素應該比之後的元素都小,則將index2替換成indexmid。如此迴圈,知道index1與index2的差值位數為1,則最終indexmid的位置就是最小數字的位置。

注:存在一種情況如1,0,1,1,1,若index1和index2和indexmid三個數字相等,則按照順序查詢

#include#includeusing namespace std;

class solution

indexmid = (index1 + index2) / 2;

if (roratearray[index1] == roratearray[index2] && roratearray[indexmid] == roratearray[index1])

return mininorder(roratearray, index1, index2);

if (roratearray[indexmid] >= roratearray[index1])

index1 = indexmid;

if (roratearray[indexmid] <= roratearray[index2])

index2 = indexmid;

} return roratearray[indexmid];

} int mininorder(vectorroratearray, int index1, int index2)

//找到最小的那個數字

return res;

}};void main()

while (ch == ',');

solution* object = new solution();

result=object->minnumberinrotatearray(rotatearray);

cout << result << endl;

}

劍指offer 旋轉陣列的最小數

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...

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

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...

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

記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...