題目:輸入n個數,求這n個數排序後,相鄰數的最大差值。要求時間複雜度為o(n).
我們可以用桶排序的思想, 把n個數分到 n + 1個桶中,然後我們用桶存連續長度的乙個範圍的數,每個桶負責的範圍是(maxn - minn)/ n(maxn是序列中最大的數,minn是序列中最小的數), 如果乙個數為num,那麼這個數應存進(num - minn) * n / (maxn - minn) 號桶。
由相鄰數差值的平均值為(maxn - minn) / ( n - 1) 和每個桶負責的範圍可輕易得知相鄰最大差肯定不在同乙個桶內, 排序後的最大差值只可能來自某個非空桶中的最小值減去前乙個非空桶中的最大值,所以每個桶只記錄最大值和最小值就行了。
#include
using
namespace std;
const ll inf =
0x3f3f3f3f
;const ll mod =
1e9+7;
const ll n =
1e5+10;
int n;
int a[n]
;int vis[n]
;//判斷該桶有沒有數
int maxs[n]
, mins[n]
;int
main()
if(maxn == minn)
//特判
cout <<
0<< endl;
else
int last = maxs[0]
;int ans =0;
for(
int i =
1; i <= n; i++)}
cout << ans << endl;
}return0;
}
陣列相鄰兩數最大差值
思路 因為要求時間複雜度為o n 且不能用非比較排序,常用的比較排序很難做到o n 這裡是借助n 1個桶,將n個數平均分配到n個桶裡,所以我們所求的最大差值肯定不在乙個桶內 只有乙個數另說 然後依次求出當前桶最小值與前乙個非空桶最大值的差值,求出最大的差值就是我們要的結果。static class ...
陣列排序相鄰元素的最大差值
題目 給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度o n 且要求不能用非基於比較的排序。解題思路 借助桶排序 created by yzm on 11 12 18.include include includeusing namespace std class maxgap in...
相鄰兩數最大差值
有乙個整形陣列a,請設計乙個複雜度為o n 的演算法,算出排序後相鄰兩數的最大差值。給定乙個int陣列a和a的大小n,請返回最大的差值。保證陣列元素多於1個。測試樣例 1,2,5,4,6 5返回 2 基於桶排序的思想完成,不考慮兩個相同的桶內的差值,只考慮該桶的最小值減去上乙個桶的最大值,最大的就是...