面試題 查詢旋轉陣列中的某一元素

2021-09-12 09:50:44 字數 1686 閱讀 5848

題目:乙個陣列是由乙個遞增數列右移若干位形成的,比如是由左移兩位形成的,在這種陣列中查詢某乙個數。
這道題其實是前面介紹的一道題目:面試題8:旋轉陣列的最小數字 的乙個變種。

解題思路如下:

首先通過「面試題8:旋轉陣列的最小數字」這道題目中獲取元素**點,時間複雜度為o(log(n))

因為旋轉陣列是由遞增陣列右移得到,因此旋轉陣列中的第乙個元素是整個陣列的中間元素,比較待查詢元素與第乙個元素,如果待查詢元素大於等於第乙個元素,表明待查詢元素在前半段有序陣列中;如果不是這待查詢元素在後半段陣列中。

判斷待查詢元素所在的有序陣列以後,我們通過乙個簡單的二分查詢就可以找出元素所在位置,時間複雜度也是o(log(n))

總是時間複雜度為2個o(log(n)),所以時間複雜度還是o(log(n))。

**例項

#include#include

#include

#include

using

namespace

std;

//函式宣告

int getsplitindex(int arry,int len);//

獲取**點座標

int binarysearch(int arry,int len,int value);//

二分查詢通用演算法

int findnuminrotatedarry(int arry,int len,int value);//

查詢元素位置

//二分查詢演算法,不使用遞迴,如果存在返回陣列位置,不存在則返回-1

int binarysearch(int arry,int start,int end,int

value)

return -1;}

int getsplitindex(int arry,int len)//

返回最小數的座標

return

index;

}//如果中間元素小於末尾元素,那麼表明中間元素在後半段陣列中,修改end指標

if(arry[mid]

//如果中間元素大於首元素,那麼表明中間元素在前半段陣列中,修改start指標

else

if(arry[mid]>arry[start])

}return -1;}

int findnuminrotatedarry(int arry,int len,int value)//

返回最小數的座標

else

//否則在後半段查詢

return -1;}

void

main()

;

int len=sizeof(arry)/sizeof(int

);

int value=3

;

int index=findnuminrotatedarry(arry,len,value);

cout

<

查詢數在陣列中的位置:

"system(

"pause");

}

程式輸出結果:

**點座標:2

查詢數在陣列中的位置:4

請按任意鍵繼續. . .

posted @

2012-05-07 19:09

xwdreamer 閱讀(

...)

編輯收藏

獲取陣列中某一元素

1 array shift 彈出陣列第乙個元素 舉例 a array new hello cool new array shift a new是第乙個元素值,取最後乙個元素可以用array pop 這種操作會改變原陣列的內容 2 array slice 擷取陣列 舉例 a array new hel...

LeetCode 陣列 有序陣列中的單一元素

給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 輸入 1,1,2,3,3,4,4,8,8 輸出 2 輸入 3,3,7,7,10,11,11 輸出 10注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。將陣列中的值進行異或,最終...

540 有序陣列中的單一元素

給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 1 輸入 1,1,2,3,3,4,4,8,8 輸出 2示例 2 輸入 3,3,7,7,10,11,11 輸出 10注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。解題思路 1....