查看: 33|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    昨天 10:23
  • 签到天数: 52 天

    [LV.5]常住居民I

    51

    主题

    0

    回帖

    86

    积分

    注册会员

    Rank: 2

    积分
    86
    发表于 2025-7-22 10:21:18 | 显示全部楼层 |阅读模式
    一、问题描述
    牛客4582题要求在一个未排序的整数数组中,找出排序后相邻元素的最大差值。题目要求时间复杂度为O(n),空间复杂度为O(n)。
    二、算法核心思想
    采用桶排序的变种方法:
    • 计算数组最小最大值
    • 确定桶的大小和数量
    • 将元素分配到各个桶中
    • 记录每个桶的最大最小值
    • 比较相邻非空桶的最小值与前一桶的最大值

    三、完整代码实现(带注释)
    1. #include <iostream>
    2. #include <vector>
    3. #include <climits>
    4. #include <algorithm>
    5. using namespace std;

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

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

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

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

    17.     // 元素分桶
    18.     for (int num : nums) {
    19.         int idx = (num - min_val) / bucket_size;
    20.         buckets[idx].first = min(buckets[idx].first, num);
    21.         buckets[idx].second = max(buckets[idx].second, num);
    22.     }

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

    30.     return max_gap;
    31. }

    32. int main() {
    33.     int n, a;
    34.     vector<int> test1;
    35.     while (cin >> n) {
    36.         test1.clear();
    37.         for (int i = 0; i < n; i++) {
    38.             cin >> a;
    39.             test1.push_back(a);
    40.         }
    41.         cout << maximumGap(test1) << endl;
    42.     }
    43.     return 0;
    44. }
    复制代码


    四、关键点解析
    • 桶大小计算

      • 确保至少有一个元素在桶中
      • 公式:max(1, (max_val - min_val)/(n-1))

    • 桶数量确定

      • 根据数据范围动态调整
      • 公式:(max_val - min_val)/bucket_size + 1

    • 空桶处理

      • 跳过没有元素的桶
      • 确保只比较有数据的相邻桶

    五、扩展思考
    • 如何处理浮点数数组?
    • 如果数据分布极不均匀如何优化
    • 如何扩展到多维数据?
    • 如何并行化这个算法?

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

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表