問題描述:
最大間隙問題:給定n 個實數x1 , x2 , , xn ,求這n 個數在實軸上相鄰2 個數之間的最大差值。假設對
任何實數的下取整函式耗時o(1),設計解最大間隙問題的線性時間演算法。
程式設計任務:
對於給定的n 個實數 x1 , x2, ……, xn,程式設計計算它們的最大間隙。
資料樣例:
輸入資料: 5
2.3 3.1 7.5 1.56.3
輸出資料:
3.2解題思路:
1,比較直接的方法是先對n個數進行排序,最快時間為nlogn,然後遍歷資料順便計算每兩個資料之間的間隔
該方法不是線性時間
2,想要用線性時間解決該問題可以使用組合數學中學到的鴿巢原理,將n個數放入n-1個桶中,每個桶大小相同為(max-min)/(n-1)且有乙個上界和乙個下界,第i個桶的上界為第i+1個桶的下界;
由於除去最小數字和最大數字還剩下n-2個數字,因此至少有乙個桶是空的,因為最小數字一定是第1個桶的下界,最大數字一定是第n-1個桶的上界;
初始狀態每個桶的上下界分別為[max,min],遍歷所有數字(o(n)時間),將每個數字放入到第對應的桶中,並更新桶的上下界,例如有乙個4-6的桶初始界為[8,2],只有5落入該桶,則桶的上下界更新為[5,5],並設定計數器count記錄每個桶中的數字個數;
然後,一次線性掃瞄即可得到最大間隙。
(我承認沒有用桶排序,但是這樣子很是方便,複雜度方面也只是nlgn,還好吧,桶排序回頭再學一學)
# include
# include
int comp(const void *a,const void *b)
void main()
qsort(a,n,sizeof(float),comp);
for(i=0;i
qsort(b,n-1,sizeof(float),comp);
printf("%f",b[n-2]);
}
為什麼要學習程式設計呢
每天在csdn社群閒逛的時候,總是看到一些前輩說的到了40歲左右,不知何去何從,自己掌握的技術已經漸漸在過時,而現在新興的自己有沒有那麼多的精力去學習.我心裡有點後悔來學習程式設計了吧.之前工作,覺得一成不變,今天知道自己明天幹啥,今年又知道明年幹什麼,所以內心的小野心就在不斷的發酵,最後選擇了過來...
為什麼要C幣呢
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
29歲為什麼還那麼短視呢?
今天 2014年6月5日 我非常鬱悶。由於今年下半年我們須要仿今年最流行的 刀塔傳奇 遊戲。於是高薪招聘乙個主美。讓hr從招聘站點搜尋乙個29歲的主美來面試,而這個主美的簡歷非常特別 大專未畢業,並且專業是英語,可是他卻搞了八年的遊戲美術。我對他的簡歷非常興趣,於是請hr約來筆試和面試。從筆試結果看...