计算阵列最大间隙

时间:2015-10-20 06:56:36

标签: c++ algorithm

我正在研究这个问题,这里有详细的问题和描述。实际上我确实搜索了一些解决方案,但都是相似的。我的问题是,为什么只计算交叉铲斗间隙?为什么不考虑桶内,最大/最小差异?感谢。

给定一个未排序的数组,找到其排序形式的连续元素之间的最大差异。

尝试在线性时间/空间中解决它。

如果数组包含少于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;
}

1 个答案:

答案 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>水桶。

为避免考虑两种情况,我通常会在左端关闭水桶,在右端开启水桶。也就是说,最左边的点包含在桶中,最右边的点包含在下一个桶中。最后一个桶由一个点组成 - 间隔的结束。