题目描述:给定有序数组,要求找出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之间有了。