【发布时间】:2021-12-30 21:35:39
【问题描述】:
要求有点复杂 假设我们有一个未排序的数组,例如:{12, 72, 93, 0, 24, 56, 102}
如果我们有一个奇数位置,我们必须寻找他右边的下一个更大的元素,假设我们取 v[1] = 12,'12' 的 nge 是 24;
但是如果我们有一个偶数位置,我们必须在他的左边寻找下一个更大的元素,假设我们取 v[2] = 72,没有大于 '72' 的数字,所以我们将打印'-1';再举个例子,v[4] = 0,'0'的nge是12;
输出应该是:24 -1 102 12 56 72 -1
我试图在 C++ 中解决这个问题:
#include <iostream>
using namespace std;
int main() {
const int CONST = 10000;
int n, v[CONST];
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
for (int i = 1; i <= n; i++) {
int next = -1;
if (i % 2 != 0) {
for (int j = i + 1; j <= n; j++) {
if (v[j] > v[i]) {
next = v[j];
break;
}
}
cout << next << " ";
}
else {
for (int k = 1; k <= i - 1; k++) {
if (v[k] > v[i]) {
next = v[k];
break;
}
}
cout << next << " ";
}
}
return 0;
}
首先,我认为我必须对数组进行排序,然后使用二进制搜索来查找下一个更大的元素
【问题讨论】:
-
您的输出取决于元素未排序的相对位置。即使好处不明显,我通常也会默认对容器进行分类 - 所以我在这里说“不要对那个容器进行分类!”很奇怪
-
@alexander s C++中数组的索引从0开始。所以数组的第一个元素的位置是偶数。:)
-
@vlad 因为他们的问题和示例的措辞,索引从 1 开始。
-
@JohnFilleau 尽管如此,程序索引应从 0 开始。
-
您对“下一个更大”的搜索在找到下一个大于时会中断。您需要遍历所有(没有
break)才能找到差异最小的那个。
标签: c++ algorithm for-loop vector max