为什么 binary_search 没有按预期工作?
Why is binary_search not working as expected?
问题是找到数组中第一个在数组中至少重复一次的元素的索引。
输入:
7
1 3 4 5 3 7 2
#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n], curr = -1;
int num = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
{
int x = a[i];
a[i] = -1;
if (binary_search(a, a + num, x))
{
curr = i;
cout << curr << endl;
break;
}
}
cout << curr + 1;
return 0;
}
预期输出:
2个
(因为3是数组中第一个出现两次的元素)
收到的输出:
0
cin >> n;
int a[n]
这在 C++ 中是不允许的。数组变量的大小必须是编译时常量。 n
不是编译时常量。要创建运行时长度数组,您必须动态分配它。最简单的解决方案是使用 std::vector
、
int num = sizeof(a) / sizeof(a[0]);
改为使用std::size(a)
获取数组的大小。但是,在这种情况下,只需使用 n
.
binary_search(a, a + num, x)
必须对输入范围进行部分排序才能对搜索到的数字使用 std::binary_search
。由于您可能使用所有元素作为搜索数字,这实际上意味着数组必须完全排序。
Input:
7
1 3 4 5 3 7 2
您的输入数组未完全排序。由于违反了 pre-condition,程序的行为未定义。
问题是找到数组中第一个在数组中至少重复一次的元素的索引。
输入:
7
1 3 4 5 3 7 2
#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n], curr = -1;
int num = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
{
int x = a[i];
a[i] = -1;
if (binary_search(a, a + num, x))
{
curr = i;
cout << curr << endl;
break;
}
}
cout << curr + 1;
return 0;
}
预期输出: 2个 (因为3是数组中第一个出现两次的元素)
收到的输出: 0
cin >> n; int a[n]
这在 C++ 中是不允许的。数组变量的大小必须是编译时常量。 n
不是编译时常量。要创建运行时长度数组,您必须动态分配它。最简单的解决方案是使用 std::vector
、
int num = sizeof(a) / sizeof(a[0]);
改为使用std::size(a)
获取数组的大小。但是,在这种情况下,只需使用 n
.
binary_search(a, a + num, x)
必须对输入范围进行部分排序才能对搜索到的数字使用 std::binary_search
。由于您可能使用所有元素作为搜索数字,这实际上意味着数组必须完全排序。
Input:
7 1 3 4 5 3 7 2
您的输入数组未完全排序。由于违反了 pre-condition,程序的行为未定义。