問題
給定乙個公升序的整數陣列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 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...