我正在研究这个问题,这里有详细的问题和描述。其实我找了几个解决方案,都很相似。我的问题是,为什么只计算跨桶差距?为什么不考虑桶内的最大/最小差异?谢谢。阵列最大差距的计算
给定一个未排序的数组,找出排序后的元素之间的最大差异。
尝试在线性时间/空间中解决它。
如果数组包含少于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通过你提供的算法在所有点都在同一个桶中的情况下有问题(例如,如果所有点都是相同的) –