題目:乙個陣列是由乙個遞增數列右移若干位形成的,比如是由左移兩位形成的,在這種陣列中查詢某乙個數。這道題其實是前面介紹的一道題目:面試題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....