TA的每日心情 | 无聊 昨天 10:23 |
---|
签到天数: 52 天 [LV.5]常住居民I
注册会员

- 积分
- 86
|
一、问题描述牛客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[idx].first = min(buckets[idx].first, num);
- buckets[idx].second = max(buckets[idx].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;
- }
复制代码
四、关键点解析五、扩展思考如何处理浮点数数组? 如何扩展到多维数据? 如何并行化这个算法?
来源:牛客4582题解:桶排序算法求最大间隔详解
|
|