164. 最大间距

题目链接:164. 最大间距 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解析:

排序后相邻数字最大间距 要 >= ceil((max - min) / (n - 1))

然后分桶,保持每个桶的max和min即可

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int min_v = nums[0], max_v = nums[0];
        int n = nums.size();
        int same_flag = true;
        for (int i = 1; i < n; i++) {
            min_v = min(nums[i], min_v);
            max_v = max(nums[i], max_v);
            if (nums[i] != nums[i - 1]) {
                same_flag = false;
            }
        }
        if (same_flag) return 0;

        int segment = ceil((max_v - min_v) / (double) (n - 1));
        vector<vector<int>> terminal;
        terminal.reserve(n + 1);
        for (int i = 0; i <= n; i++) {
            vector<int> inner;
            terminal.push_back(inner);
            terminal[i].push_back(-1);
            terminal[i].push_back(0x7fffffff);
        }
        for (int i = 0; i < n; i++) {
            int d = (nums[i] - min_v) / segment;
            terminal[d][0] = max(terminal[d][0], nums[i]);
            terminal[d][1] = min(terminal[d][1], nums[i]);
        }
        int pre_max = -1;
        int ret = -1;
        for (int i = 0; i <= n; i++) {
            if (terminal[i][0] == -1) continue;
            cout << terminal[i][1] << "  " << terminal[i][0] << endl;
            if (pre_max == -1) {
                pre_max = terminal[i][0];
            } else {
                ret = max(ret, terminal[i][1] - pre_max);
                pre_max = terminal[i][0];
            }
        }
        return ret;




        
    }
};

 

posted @ 2025-11-08 20:33  WTSRUVF  阅读(4)  评论(0)    收藏  举报