查看: 34|回复: 0

桶排序算法实战:牛客4493题最大间隔问题详解

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

    [LV.5]常住居民I

    51

    主题

    0

    回帖

    86

    积分

    注册会员

    Rank: 2

    积分
    86
    发表于 2025-7-19 09:41:29 | 显示全部楼层 |阅读模式
    本帖最后由 19339201706 于 2025-7-19 09:52 编辑

    一、问题背景与算法思路
    本题要求在一个无序数组中找到排序后相邻元素的最大差值。直接排序后遍历的时间复杂度为O(nlogn),而题目要求O(n)时间复杂度。我们采用桶排序的变种算法,通过巧妙的分桶策略来优化计算。
    二、完整代码实现(带详细注释)
    1. class MaxDivision { public: int maxGap(vector& nums) { if (nums.size() < 2) return 0; // 边界条件处理
    2.     // 找出数组中的最小值和最大值
    3.     int min_val = *min_element(nums.begin(), nums.end());
    4.     int max_val = *max_element(nums.begin(), nums.end());

    5.     // 计算桶的大小和数量(关键步骤)
    6.     int bucket_size = max(1, (max_val - min_val) / ((int)nums.size() - 1));
    7.     int bucket_num = (max_val - min_val) / bucket_size + 1;

    8.     // 初始化桶(存储每个桶的最小值和最大值)
    9.     vector<pair<int, int>> buckets(bucket_num, {INT_MAX, INT_MIN});

    10.     // 将元素放入桶中
    11.     for (int num : nums) {
    12.         int idx = (num - min_val) / bucket_size;  // 计算桶索引
    13.         buckets[idx].first = min(buckets[idx].first, num);
    14.         buckets[idx].second = max(buckets[idx].second, num);
    15.     }

    16.     // 计算最大间隔(关键步骤)
    17.     int max_gap = 0;
    18.     int prev_max = min_val;  // 前一个非空桶的最大值

    19.     for (auto& bucket : buckets) {
    20.         if (bucket.first == INT_MAX) continue; // 跳过空桶
    21.         max_gap = max(max_gap, bucket.first - prev_max);
    22.         prev_max = bucket.second;  // 更新前一个非空桶的最大值
    23.     }

    24.     return max_gap;
    25. }

    26. int findMaxDivision(vector<int> A, int n) {
    27.     MaxDivision div;
    28.     return div.maxGap(A);  // 接口适配函数
    29. }
    30. };
    复制代码


    三、关键算法要点
    • 分桶策略:根据数组长度动态计算桶的大小和数量
    • 桶内存储:每个桶只记录最小值和最大值
    • 间隔计算:最大间隔一定出现在相邻非空桶之间
    • 边界处理:处理空桶和最小/最大值的情况

    四、复杂度分析
    • 时间复杂度:O(n) (3次线性遍历)
    • 空间复杂度:O(n) (桶的存储空间)

    五、常见错误提醒
    • 忘记处理数组长度小于2的情况
    • 桶大小计算错误(必须至少为1)
    • 没有正确处理空桶的情况
    • 初始prev_max值设置错误

    六、学习价值
    通过本题可以掌握:
    • 桶排序的变种应用
    • 线性时间复杂度的排序相关问题解法
    • 分桶策略的设计思路
    • 极值问题的优化处理方法

    来源:大矩学习资料

    回复

    使用道具 举报

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

    本版积分规则

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