LeetCode 164. Maximum Gap
阿新 • • 發佈:2018-11-07
題解
求連續極大差,要求O(n)。
利用鴿籠原理。
先給出一個前置條件,即最大差不小於(max-min)/(n-1),為什麼?
想象一個階梯,階梯間的最大高度差和平均高度差的關係。
有了這個差值,我們可以把原陣列依據其所在區間分為n-1個桶。
顯然落於同一個桶內的數我們不關心,我們只關心相鄰桶間的數。
n個數,除了最大最小之外,還有n-2個數,入n-1個桶,至少有一個桶沒有數。
答案就是跨越這個空桶(可能不止一個)的兩邊桶間 最大數的差值。
ps:具體實現的時候每個桶內只存區間內最大最小值。這樣相鄰的好計算。
Code
int maximumGap(vector< int>& nums) {
if(nums.empty()||nums.size()<2) return 0;
int n=nums.size();
int _max,_min;
_max=_min=nums[0];
for(int i:nums){
_max=max(_max,i);
_min=min(_min,i);
}
if(_max==_min) return 0;
double gap = (double)(_max-_min)/(n-1);
vector<int> g_min(n,INT_MAX);
vector<int> g_max(n,INT_MIN);
for(int num:nums){
int idx = (num-_min)/gap;
g_min[idx]=min(g_min[idx],num);
g_max[idx]=max(g_max[idx],num);
}
int res=0,pre=g_max[0];
for(int i=1;i<n;i++){
if(g_min[i]==INT_MAX && g_max[i]==INT_MIN) continue;
res=max(res,g_min[i]-pre);// cur_min - pre_max
pre=g_max[i];
}
return res;
}