在旋轉有序陣列中查詢元素

2021-09-27 12:53:10 字數 1552 閱讀 8041

1. 題目:給定乙個旋轉的有序陣列,比如是旋轉之後得到的,在陣列中查詢是否存在元素key。要求時間複雜度為o(lgn)。假定陣列中不存在重複元素。

2. 分析:從上面的選擇陣列可以發現,array[middle]將陣列分成兩段,兩段中必有一段是有序的。這樣就可以使用二分查詢了。乙個變形的二分查詢。

3. **:

1 #include 2 #include 3

4using

namespace

std;56

int rotatebinarysearch(int *a,int alength,int

key)717

//低端有序

18if (a[low]<=a[middle])

1924

else

2528}29

//高階有序

30else

3136

else

3740}41

}42return -1;43

}44intmain()45;

47int a[alength]=;

48for (int i=0;i)49

52 cout<11

);53 cout<

54return0;

55 }

4. 乙個變形題目:給定乙個旋轉有序陣列,這個陣列是通過下面的方式得到的:給定乙個有序陣列(從小到大)和乙個數x(0<=x<=arraylength-1),陣列中的第i位置的元素變到a[(i+x)%arraylength]位置。求出x的值。

分析:原先陣列中最小的數也就是下標為0的數經過旋轉後變到的位置為a[x],所以只要找到這個最小的數,其所在位置就是x。

**:

1 #include 2 #include 3

4using

namespace

std;56

int findx(int *a,int

alength)717

else

18 high=middle;19}

20return

low;21}

22void testfindx(int *a,int

alength)

2331 cout

32}33 cout<

34delete b;35}

36int

main()37;

39int a[alength]=;

40testfindx(a,alength);

41return0;

42 }

注意點:注意這次二分查詢的迴圈條件,並使用low記錄最小元素的位置,返回low。

5. 在上面的testfindx中陣列旋轉都是使用新的陣列來儲存。如果要求原地旋轉怎麼辦?這個就是乙個三次逆轉的過程了:比如經過k=3的旋轉變為,可以通過三次逆轉實現,第一步將a到a+k逆轉,即將逆轉為;第二步將a+k+1到a+alength-1逆轉,即將變為。

此時的陣列已變成;第三步講上面逆轉之後的陣列整體逆轉變為。經過上面的三步就實現了陣列的原地旋轉。

在排序陣列中查詢元素

34.在排序陣列中查詢元素的第乙個和最後乙個位置。給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 include include include...

扭轉有序陣列 查詢指定元素

面試題 扭轉後的有序陣列,找到指定的數,返回下標,找不到時返回 1 樣例輸入 3,4,5,6,7,1,2 查詢數字7 樣例輸出 4 審題 有序,扭轉,那麼一部分是有序的,一部分是無序的 思路 二分查詢,必須找到 關鍵點在於 1.利用中間元素去判斷,因為是已經有序的,如果左側小於它,而扭轉後的元素一定...

演算法 部分有序陣列元素查詢

查詢某元素是否在在陣列中返回位置,要求時間複雜度不能大於o n 使用二分查詢 問題的關鍵在於找到最大值所在位置 屬於前半部分就在前半部分二分查詢,否則在後半部分二分查詢 func search arr int value int int?else if value arr 0 value arr m...