我正在研究這個問題,這裏有詳細的問題和描述。其實我找了幾個解決方案,都很相似。我的問題是,爲什麼只計算跨桶差距?爲什麼不考慮桶內的最大/最小差異?謝謝。陣列最大差距的計算
給定一個未排序的數組,找出排序後的元素之間的最大差異。
嘗試在線性時間/空間中解決它。
如果數組包含少於2個元素,則返回0。
您可能會認爲數組中的所有元素都是非負整數,並且符合32位有符號整數範圍。
int maximumGap(vector<int>& nums) {
const int n = nums.size();
if(n<=1) return 0;
int maxE = *max_element(nums.begin(),nums.end());
int minE = *min_element(nums.begin(),nums.end());
double len = double(maxE-minE)/double(n-1);
vector<int> maxA(n,INT_MIN);
vector<int> minA(n,INT_MAX);
for(int i=0; i<n; i++) {
int index = (nums[i]-minE)/len;
maxA[index] = max(maxA[index],nums[i]);
minA[index] = min(minA[index],nums[i]);
}
int gap = 0, prev = maxA[0];
for(int i=1; i<n; i++) {
if(minA[i]==INT_MAX) continue;
gap = max(gap,minA[i]-prev);
prev = maxA[i];
}
return gap;
}
謝謝Ivaylo,我的困惑是,假設元素均勻分佈在所有桶中,那麼我們也應該考慮maxA [index] - minA [index]呢?如果是這樣,爲什麼解決方案不計入這種情況?謝謝。 –
@LinMa我正要爲此添加一個句子。 –
@LinMa通過你提供的算法在所有點都在同一個桶中的情況下有問題(例如,如果所有點都是相同的) –