旋轉陣列的查詢問題

2021-07-02 22:57:19 字數 1337 閱讀 6420

題目:乙個陣列是由乙個遞增數列右移若干位形成的,比如是由左移兩位形成的,在這種陣列中查詢某乙個數。

解題思路如下:

首先獲取元素**點,時間複雜度為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)//返回最小數的座標

//如果中間元素小於末尾元素,那麼表明中間元素在後半段陣列中,修改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);

intvalue=3;

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

cout<<"查詢數在陣列中的位置:"

<"pause");

}

旋轉陣列問題求解

將包含 n 個元素的陣列向右旋轉 k 步。例如,如果 n 7 k 3,給定陣列 1,2,3,4,5,6,7 向右旋轉後的結果 5,6,7,1,2,3,4 可以每次將陣列中的元素右移一位,迴圈k次。由於向右旋轉位數k可能大於陣列元素個數n,所以通用的規律是 右移位數k k n。假設乙個陣列序列為abc...

旋轉陣列相關問題

1.把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 旋轉陣列有三種情況 1.array mid array high...

leedcode問題 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,4...