微策略面試題:在旋轉後的陣列中查詢元素(二分查詢)
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/17123303
一個無重複元素的有序陣列,經過若干次旋轉後,得到一個新陣列。比如[1,4,5,8,10,12,56,78]變成[12,56,78,1,4,5,8,10]。
現在要在這個陣列中尋找元素。
其實演算法很簡單,就是用二分查詢,只不過要看mid是屬於哪個部分(前半部分還是後半部分),因此有四種情況。
程式碼如下:
#include <iostream>
using namespace std;
int a[1000];
int find(int a[],int len,int x)
{
int start=0,end=len-1,mid;
while (start<=end)
{
mid=(start+end)/2;
if (a[mid]==x)
return mid;
if (a[start]<a[mid])
{
if (a[mid]<x)
start=mid+1;
else
end=mid-1;
}
else
{
if (a[mid]<x)
end=mid-1;
else
start=mid+1;
}
}
return -1;
}
int main()
{
int n,x;
while (cin>>n>>x)
{
for (int i=0;i<n;i++)
cin>>a[i];
cout<<find(a,n,x)<<endl;
}
return 0;
}
以上程式碼對輸入輸出的處理是模仿ACM的。n表示陣列元素個數,x表示要找的元素,然後n個數(保證無重複,並且是旋轉後的陣列)。
另外,說一下為什麼要無重複。如果有重複,就不能通過mid判斷屬於哪部分,要通過其他方法,這就不是簡單的二分查詢了,時間複雜度也不再是O(log n)了。
比如
3,3,3,5,3,3,3,3,3,3中找5
3,3,3,3,3,3,3,3,5,3中找5
3,3,3,1,3,3,3,3,3,3中找1
3,3,3,3,3,3,3,3,1,3中找1
相關文章
- 【Java】陣列二分查詢元素Java陣列
- 面試題——二維陣列中的查詢面試題陣列
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- 陣列的主元素查詢陣列
- JavaScript專題之學underscore在陣列中查詢指定元素JavaScript陣列
- Javascript刷題 》 查詢陣列元素位置JavaScript陣列
- 查詢陣列中第K大的元素陣列
- js查詢陣列元素位置JS陣列
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 在排序陣列中查詢元素的第一個和最後一個位置排序陣列
- 二維陣列中的查詢陣列
- Java中查詢陣列多數元素的4種方法Java陣列
- 34. 在排序陣列中查詢元素的第一個和最後一個位置(中)排序陣列
- 查詢——二分查詢
- LeetCodeHot100 二分查詢 35. 搜尋插入位置 74. 搜尋二維矩陣 34. 在排序陣列中查詢元素的第一個和最後一個位置 33. 搜尋旋轉排序陣列 153. 尋找旋轉排序陣列中的最小值LeetCode矩陣排序陣列
- 演算法學習-查詢旋轉陣列的最小值演算法陣列
- 查詢演算法集:順序查詢、二分查詢、插值查詢、動態查詢(陣列實現、連結串列實現)演算法陣列
- JS能力測評經典題--查詢陣列元素位置JS陣列
- 二分查詢—包括查詢第一個目標元素和最後一個目標元素
- 【JZOF】二維陣列中的查詢陣列
- 陣列中查詢給定值陣列
- php陣列中二分查詢是什麼PHP陣列
- 【劍指offer】二分查詢二維陣列陣列
- 旋轉陣列中的最小元素陣列
- 在靜態類中定義一個泛型方法查詢陣列元素泛型陣列
- Python查詢-二分查詢Python
- java陣列回顧---線性查詢最大值最小值---二分查詢Java陣列
- 二分查詢(一)——純粹的二分查詢
- 二維陣列查詢陣列
- JavaFX教程-查詢陣列Java陣列
- 九度 二維陣列中的查詢陣列
- 在一個長度為n的不同元素的陣列中順序查詢元素x,查詢成功時的平均比較次數為多少陣列
- 查詢演算法__二分查詢演算法
- 順序查詢和二分查詢
- 【LeetCode-陣列】查詢大多數元素LeetCode陣列
- 有序陣列1 2 3 4 5 6 7 8 9查詢3的二分查詢序列是陣列
- 第二章 :查詢與排序-------2.17解題實戰_旋轉陣列的最小數字(改造二分法)排序陣列
- 每日一練(24):在排序陣列中查詢數字排序陣列