题目描述:给定有序数组,要求找出A[i]=i的索引。(没有重复元素)

简单粗暴的方法:遍历一遍(这里可以优化,若当前A[i] != i,但是A[i] > i,那么因为数组有序,所以后面的元素不可能满足条件,可以直接输出了,这个思想可以用到有重复元素的情况下)。

二分递归法:比较A[mid]与mid的关系,等于则返回,小于说明左半部分不可能有满足的,同理右半部分。

 1 #include <iostream>
 2 #include <queue>
 3 #include <climits>
 4 #include <algorithm>
 5 #include <memory.h>
 6 #include <stdio.h>
 7 #include <ostream>
 8 #include <vector>
 9 #include <list>
10 #include <cmath>
11 #include <string>
12 #include <stdexcept>
13 #include <stack>
14 using namespace std;
15 
16 int fun(int arrayP[],int n,int s,int e)
17 {
18     if(s < e || s < 0 || e >= n)
19         return -1;
20     int mid = (s+e)/2;
21     if(arrayP[mid] == mid)
22         return mid;
23     else if(arrayP[mid] < mid)
24         return fun(arrayP,n,mid+1,e);
25     else
26         return fun(arrayP,n,s,mid-1);
27 }
28 
29 int main()
30 {
31     
32     return 0;
33 }

如果有重复元素,就不能向这样去解了,必须考虑重复的问题,但是可以利用之前提到的思想进行优化,缩小左右部分遍历的范围。

如,重复元素时,A[5] = 3,那么最多只能在0~3之间有了。