description
设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 .注意输出最后有个空格.
code
- 注意题目给出的已知条件:有序,不相同
- 输出的No后面也有空格 O(∩_∩)O
- 代码如下:
/******************************************
* @Author : 鱼香肉丝没有鱼
* @Date : 2021-09-25 16:04:09
* @LastEditors : 鱼香肉丝没有鱼
* @LastEditTime : 2021-11-18 21:06:46
******************************************/
//注意题目中的条件,
// 不同的整数,排好了序
//但是题目没有说是升序还是降序
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int cnt = 0; // equa数组的索引
void find(int* arr, int* equa, int l, int r, int flag)
{
if(l > r)
return; // end the recursion;
int mid = (l + r) >> 1;
if(arr[mid] == mid) {
equa[cnt++] = mid; // save the value of mid
find(arr, equa, l, mid - 1, flag);
find(arr, equa, mid + 1, r, flag);
}
else if(arr[mid] < mid) {
if(flag) //升序
find(arr, equa, mid + 1, r, flag);
else // Descending order
find(arr, equa, l, mid - 1, flag);
}
else {
if(flag)
find(arr, equa, l, mid - 1, flag);
else
find(arr, equa, mid + 1, r, flag);
}
}
int main(int argc, char* argv[])
{
int* arr = NULL; // data
int* equa = NULL; //存储索引和值相等的元素下标
int flag = 1; //升序 or 降序
int n;
// freopen("file in.txt", "r", stdin);
cin >> n;
arr = new int[n];
equa = new int[n];
for(register int i = 0; i < n; i++)
scanf("%d", &arr[i]);
if(arr[0] > arr[n - 1])
flag = 0; //降序
find(arr, equa, 0, n - 1, flag);
if(cnt) {
sort(equa, equa + cnt);//加入equa数组的时候并不是按照顺序加入的,需要拍一下序
for(register int i = 0; i < cnt; i++)
cout << equa[i] << " ";
cout << endl;
}
else
cout << "No " << endl;
delete[] arr;
delete[] equa;
return 0;
}
/*
5
5 4 3 2 1
10
-1 0 2 3 4 5 6 7 11 23
*/