尋找公升序整數陣列中元素與對應下標相等的數

2021-07-05 13:13:40 字數 912 閱讀 4807

問題

給定乙個公升序的整數陣列a,讓你在陣列中找到任意下標x,使得a[x] == x。(陣列下標從0開始)

例如:

[-1, 0, 1, 3, 10]中,x = 3即為所求。

解析:

最好想的思路就是遍歷整個陣列,

這樣時間複雜度為o(n).

另一種解法

因為題目提示了是公升序的整數陣列a,那麼就要想到能不能用二分查詢的思想。

假設我們有乙個數列b,其中b[0] > 0,那麼易得,該陣列中,必然不會出現所求的數字。

同理,如果b[n] < n,那麼,在b[0...n]中,也不會有所求的數字。

因此我們可以在o(1)的時間內判斷乙個陣列是否含有a[x] == x的數字。

然後採用二分的方法,所以能在o(logn)次內找到要找的數字。

**:

#includeusing namespace std;

int searchnum(int *a,int n)

{ int low=0,high=n-1;

int m;

while(low<=high)

{m=(low&high)+((low^high)>>1);

if(a[m]==m)

return m;

else

{ if(a[m]

隨筆 尋找陣列中元素的峰值

題目 峰值元素是指其值大於左右相鄰值的元素。給定乙個輸入陣列 nums,其中 nums i nums i 1 找到峰值元素並返回其索引。陣列可能包含多個峰值,在這種情況下,返回任何乙個峰值所在位置即可。你可以假設 nums 1 nums n 示例 1 輸入 nums 1,2,3,1 輸出 2 解釋 ...

求兩個已排序 公升序 等長的整數陣列所有元素的中位數

演算法課的題目,給定兩個整數陣列x,y,兩個陣列已被排序 公升序 陣列長度都是n,求這2n個數的中位數。最容易想到的是,新建立以個陣列 z 2n 將x,y的所有元素排序放入,然後取中間兩個數,不過當陣列很大時,效率不行啊。不僅空間複雜度很大,重新排序的話也要不少時間.分析 因為兩個陣列已經排序了,可...

隨機整數陣列去重與排序

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...