記錄來自《劍指offer》上的演算法題。
題目描述如下:
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,然後就需要尋找陣列的中間元素,如果中間元素是位於前面的遞增序列,則指向第乙個元素的指標指向中間元素,從而縮小範圍,否則中間元素就是位於後面的遞增序列,然後讓第二個指標指向這個中間元素。然後判斷兩個指標是否剛好是相鄰,即相減是否為一,如果是,就結束尋找,然後第二個指標指向的元素就是需要尋找的最小值,否則再繼續尋找中間元素,重複上述步驟。
實現**如下:
// 尋找旋轉陣列的最小值
int min(int* numbers, int length)
int index1 = 0;
int index2 = length - 1;
int indexmid = index1;
while (numbers[index1] >= numbers[index2])
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)
return result;
}// 測試
int main(void);
cout
<< "min = "
<< min(a1, 5) << endl;
// 有重複數字
int a2[5] = ;
cout
<< "min = "
<< min(a2, 5) << endl;
// 公升序排序陣列
int a3[5] = ;
cout
<< "min = "
<< min(a3, 5) << endl;
// 只有乙個數字
int a4[1] = ;
cout
<< "min = "
<< min(a4, 1) << endl;
// 特例測試
int a5[5] = ;
cout
<< "min = "
<< min(a5, 5) << endl;
int a6 = ;
cout
<< "min = "
<< min(a6, 5) << endl;
system("pause");
return
0;}
這裡需要注意一種特例,就是當兩個指標指向的元素和中間元素都相等,那麼此時只能採用順序查詢,因為此時是無法判斷中間的數字是位於前面還是後面的子串行中。 劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...
劍指offer 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 既然是旋轉陣列,那麼資料的規律肯定是保持非遞減,但遇到第乙個遞減的...