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。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...