设n个不同的整数排好序后存于T[0:n-1]中. 若存在若干(>=0)个下标i,0<= i <=n-1, 使得T[i]=i. 设计一个有效算法找到这些个下标.
数据输入: 第1行有一个正整数n, n<=1000000, 表示有n个整数(保证在int内). 接下来一行是这n个整数.
结果输出:T[i]=i的下标;若没有则输出No .注意输出最后有个空格.
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,a[N],b[N],s=0,flag=1;
void bs(int l,int r)
{
int mid=(l+r)/2;
if(l<=r)
{
if(a[mid]==mid)
{
b[s]=mid;
s++;
bs(l,mid-1);
bs(mid+1,r);
}
else if(a[mid]<mid)
{
if(flag) bs(mid+1,r);
else bs(l,mid-1);
}
else if(a[mid]>mid)
{
if(flag) bs(l,mid-1);
else bs(mid+1,r);
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
if(a[0]>a[n-1]) flag=0;
bs(0,n-1);
if(s>0)
{
sort(b,b+s);
for(int i=0;i<s;i++) printf("%d ",b[i]);
printf("\n");
}
else printf("No \n");
}