在有序序列(r1, r2, …, rn)中,存在序号i(1≤i≤n),使得ri=i。请设计一个分值算法找到这个元素,输入两行,第一行一个整数n,表示序列中包含的元素个数;第二行为n个整数,每个数以空格间隔。如果找到,输出i;否则,输出No data。要求算法在最坏情况下的时间性能为O(log2n)。给出具体实现的代码
时间: 2023-05-30 16:01:20 浏览: 330
思路:由于序列是有序的,可以使用二分查找的方法找到中间位置mid,若mid对应的元素值小于mid,则在[mid+1, n]中继续查找;若mid对应的元素值大于mid,则在[1, mid-1]中继续查找;若mid对应的元素值等于mid,则找到了目标元素,返回mid。
时间复杂度为O(log2n)。
代码如下:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int arr[n];
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
int left = 0, right = n - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(arr[mid] < mid + 1) {
left = mid + 1;
} else if(arr[mid] > mid + 1) {
right = mid - 1;
} else {
cout << mid + 1 << endl;
return 0;
}
}
cout << "No data" << endl;
return 0;
}
阅读全文