C++ 数组中寻找最接近中位数的表达式下标

给定一个数组 X 和正整数 K,请找出使表达式 x[i]-X[i+1]-X[i+K-1] 结果最接近于数组中位数的下标 i,如果有多个满足条件的 i,请返回最大的 i

思路:

首先计算出每个 i 对应的表达式的值,然后按照距离中位数的距离从小到大排序,再按照 i 从大到小排序,找到第一个满足条件的 i 即可。

具体实现:

  1. 计算每个 i 对应的表达式的值:
vector<int> expr(scores.size() - K + 1);
for (int i = 0; i < scores.size() - K + 1; i++) {
expr[i] = scores[i] - scores[i+1] - scores[i+K-1];
}
  1. 计算数组中位数:
sort(scores.begin(), scores.end());
int median = scores[scores.size() / 2];
  1. 将表达式的值按照距离中位数的距离从小到大排序:
vector<int> dist(expr.size());
for (int i = 0; i < expr.size(); i++) {
dist[i] = abs(expr[i] - median);
}
vector<int> indices(expr.size());
iota(indices.begin(), indices.end(), 0);
sort(indices.begin(), indices.end(),
    [&dist](int i, int j) {
        return dist[i] < dist[j];
    });
  1. 按照 i 从大到小排序:
sort(indices.begin(), indices.end(),
    [](int i, int j) {
        return i > j;
    });
  1. 找到第一个满足条件的 i
for (int i : indices) {
if (expr[i] == *min_element(expr.begin(), expr.end())) {
return i;
}
}
return -1; // 没有满足条件的 i

完整代码:

int findTheStartPosition(vector<int>& scores, int K) {
    // 计算每个 i 对应的表达式的值
    vector<int> expr(scores.size() - K + 1);
    for (int i = 0; i < scores.size() - K + 1; i++) {
        expr[i] = scores[i] - scores[i+1] - scores[i+K-1];
    }

    // 计算数组中位数
    sort(scores.begin(), scores.end());
    int median = scores[scores.size() / 2];

    // 将表达式的值按照距离中位数的距离从小到大排序
    vector<int> dist(expr.size());
    for (int i = 0; i < expr.size(); i++) {
        dist[i] = abs(expr[i] - median);
    }
    vector<int> indices(expr.size());
    iota(indices.begin(), indices.end(), 0);
    sort(indices.begin(), indices.end(),
        [&dist](int i, int j) {
            return dist[i] < dist[j];
        });

    // 按照 i 从大到小排序
    sort(indices.begin(), indices.end(),
        [](int i, int j) {
            return i > j;
        });

    // 找到第一个满足条件的 i
    for (int i : indices) {
        if (expr[i] == *min_element(expr.begin(), expr.end())) {
            return i;
        }
    }
    return -1; // 没有满足条件的 i
}

总结:

本文提供了一个 C++ 代码实现,用于在给定数组 X 和正整数 K 的情况下,找出使表达式 x[i]-X[i+1]-X[i+K-1] 结果最接近于数组中位数的下标 i。算法思路清晰易懂,代码简洁易读,可以作为学习参考。

C++ 数组中寻找最接近中位数的表达式下标

原文地址: https://www.cveoy.top/t/topic/onKU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录