文章

149

粉丝

195

获赞

0

访问

19.3k

头像
2026 年 408 冲刺预测 5 套卷(一) - 第41题回答
数据结构
发布于2025年11月17日 16:59
阅读数 95

1)

如果我们从右往左处理,并且维护一个有序结构(比如平衡 BST 或类似),那么对于 A[i],我们可以在有序集合中查找最接近 A[i] 的值,从而得到最小绝对差。

具体来说:

  • 从 i = n-2 到 0 倒序遍历。

  • 用一个 set(C++ 中 std::set 或 std::multiset)保存 i+1 到 n-1 的元素(即已经处理过的右侧元素)。

  • 对于 A[i],在集合中找 A[i] 的后继(第一个大于等于它的元素)和前驱(最后一个小于等于它的元素),计算差值的最小值。

  • 插入 A[i] 到集合中,继续处理前一个位置。

2)

#include <set>
#include <algorithm>
#include <climits>

void calMinDiff(int A[], int res[], int n) {
    if (n == 0) return;
    if (n == 1) {
        res[0] = -1;
        return;
    }
    
    res[n-1] = -1;
    std::set<int> rightElems;
    rightElems.insert(A[n-1]);
    
    for (int i = n-2; i >= 0; --i) {
        int current = A[i];
        auto it = rightElems.lower_bound(current);
        
        int minDiff = INT_MAX;
        
        // 检查后继
        if (it != rightElems.end()) {
            minDiff = std::min...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发