文章
149
粉丝
195
获赞
0
访问
19.3k
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...
登录后发布评论
暂无评论,来抢沙发