二分
数据已经有序,或者题目可以转化为在一个答案范围内查找满足条件的最小/最大值。
每次取中点 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;}- 忘记数据必须有序。
l、r更新成mid导致死循环。- 下标从 0 开始,输出位置时没有看清题目要求。