C++ 数组中寻找最接近中位数的表达式下标
C++ 数组中寻找最接近中位数的表达式下标
给定一个数组 X 和正整数 K,请找出使表达式 x[i]-X[i+1]-X[i+K-1] 结果最接近于数组中位数的下标 i,如果有多个满足条件的 i,请返回最大的 i。
思路:
首先计算出每个 i 对应的表达式的值,然后按照距离中位数的距离从小到大排序,再按照 i 从大到小排序,找到第一个满足条件的 i 即可。
具体实现:
- 计算每个
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
完整代码:
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。算法思路清晰易懂,代码简洁易读,可以作为学习参考。
原文地址: https://www.cveoy.top/t/topic/onKU 著作权归作者所有。请勿转载和采集!