我正在研究这个问题,这里有详细的问题和描述。实际上我确实搜索了一些解决方案,但都是相似的。我的问题是,为什么只计算交叉铲斗间隙?为什么不考虑桶内,最大/最小差异?感谢。
给定一个未排序的数组,找到其排序形式的连续元素之间的最大差异。
尝试在线性时间/空间中解决它。
如果数组包含少于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;
}
答案 0 :(得分:1)
您有n个元素,并且您希望将它们放在给定的时间间隔内。假设间隔长度为L. G的可能值是多少?两个连续元素之间的最大差距?显然G不可能超过L而且G也不能小于L/n-1
。当且仅当我们将所有元素精确地L/n-1
分开时(即所有元素彼此相等的距离),G将等于到L/n-1
。
现在因为这个规则,如果你创建大小正确L/n-1
的存储桶,我们有两个选项 - 所有元素彼此距离相等,因此答案是L/n-1
,或者答案大于L/n-1
。如果答案大于L/n-1
,则无法找到同一个桶中的两个元素(因为每个桶的长度为L/n-1
),这就是我们只考虑之间的距离< / strong>水桶。
为避免考虑两种情况,我通常会在左端关闭水桶,在右端开启水桶。也就是说,最左边的点包含在桶中,最右边的点包含在下一个桶中。最后一个桶由一个点组成 - 间隔的结束。