1. 題目:給定乙個旋轉的有序陣列,比如是旋轉之後得到的,在陣列中查詢是否存在元素key。要求時間複雜度為o(lgn)。假定陣列中不存在重複元素。
2. 分析:從上面的選擇陣列可以發現,array[middle]將陣列分成兩段,兩段中必有一段是有序的。這樣就可以使用二分查詢了。乙個變形的二分查詢。
3. **:
1 #include 2 #include 34. 乙個變形題目:給定乙個旋轉有序陣列,這個陣列是通過下面的方式得到的:給定乙個有序陣列(從小到大)和乙個數x(0<=x<=arraylength-1),陣列中的第i位置的元素變到a[(i+x)%arraylength]位置。求出x的值。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 }
分析:原先陣列中最小的數也就是下標為0的數經過旋轉後變到的位置為a[x],所以只要找到這個最小的數,其所在位置就是x。
**:
1 #include 2 #include 3注意點:注意這次二分查詢的迴圈條件,並使用low記錄最小元素的位置,返回low。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 }
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...