19339201706 发表于 2025-7-22 10:21:18

牛客4582题解:桶排序算法求最大间隔详解

https://dajuwangluo.cn/zb_users/upload/2025/07/202507111752235633266599.jpg一、问题描述牛客4582题要求在一个未排序的整数数组中,找出排序后相邻元素的最大差值。题目要求时间复杂度为O(n),空间复杂度为O(n)。二、算法核心思想采用桶排序的变种方法:
[*]计算数组最小最大值
[*]确定桶的大小和数量
[*]将元素分配到各个桶中
[*]记录每个桶的最大最小值
[*]比较相邻非空桶的最小值与前一桶的最大值
三、完整代码实现(带注释)
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;

int maximumGap(vector<int>& nums) {
    const int n = nums.size();
    if (n < 2) return 0;// 边界条件处理

    // 获取数组最小最大值
    auto minmax = minmax_element(nums.begin(), nums.end());
    int min_val = *minmax.first, max_val = *minmax.second;

    // 计算桶大小和数量
    int bucket_size = max(1, (max_val - min_val) / (n - 1));
    int bucket_num = (max_val - min_val) / bucket_size + 1;

    // 初始化桶(只需记录每个桶的最大最小值)
    vector<pair<int, int>> buckets(bucket_num, {INT_MAX, INT_MIN});

    // 元素分桶
    for (int num : nums) {
      int idx = (num - min_val) / bucket_size;
      buckets.first = min(buckets.first, num);
      buckets.second = max(buckets.second, num);
    }

    // 计算最大间隔
    int max_gap = 0, prev_max = min_val;
    for (auto& bucket : buckets) {
      if (bucket.first == INT_MAX) continue;// 跳过空桶
      max_gap = max(max_gap, bucket.first - prev_max);
      prev_max = bucket.second;
    }

    return max_gap;
}

int main() {
    int n, a;
    vector<int> test1;
    while (cin >> n) {
      test1.clear();
      for (int i = 0; i < n; i++) {
            cin >> a;
            test1.push_back(a);
      }
      cout << maximumGap(test1) << endl;
    }
    return 0;
}

四、关键点解析
[*]桶大小计算:

[*]确保至少有一个元素在桶中
[*]公式:max(1, (max_val - min_val)/(n-1))
[*]桶数量确定:

[*]根据数据范围动态调整
[*]公式:(max_val - min_val)/bucket_size + 1
[*]空桶处理:

[*]跳过没有元素的桶
[*]确保只比较有数据的相邻桶
五、扩展思考
[*]如何处理浮点数数组?
[*]如果数据分布极不均匀如何优化?
[*]如何扩展到多维数据?
[*]如何并行化这个算法?
来源:牛客4582题解:桶排序算法求最大间隔详解

页: [1]
查看完整版本: 牛客4582题解:桶排序算法求最大间隔详解