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

2021-07-25 12:11:03 字數 1836 閱讀 5994

記錄來自《劍指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。思路 既然是旋轉陣列,那麼資料的規律肯定是保持非遞減,但遇到第乙個遞減的...