跳转到内容

二分

数据已经有序,或者题目可以转化为在一个答案范围内查找满足条件的最小/最大值。

每次取中点 mid,根据判断结果丢掉一半区间。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, target;
cin >> n >> target;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
int l = 0, r = n - 1;
int ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (a[mid] == target) {
ans = mid;
break;
} else if (a[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << ans << '\n';
return 0;
}
  • 忘记数据必须有序。
  • lr 更新成 mid 导致死循环。
  • 下标从 0 开始,输出位置时没有看清题目要求。