找回密码
 立即注册
查看: 25|回复: 0

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

[复制链接]
  • 打卡等级:常驻代表
  • 打卡总天数:33
  • 打卡月天数:2
  • 打卡总奖励:223
  • 最近打卡:2025-08-14 15:12:36

39

主题

1

回帖

4597

积分

VIP会员

积分
4597
发表于 2025-7-22 10:25:23 | 显示全部楼层 |阅读模式
一、问题描述
牛客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题解:桶排序算法求**间隔详解

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

本版积分规则

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