本文参考微信号为 待字闺中的信息,欢迎大家关注。
题目: 给定一个升序数组A,让你在数组中找到任意下标x,使得A[x]=x。 例如:[-1,1,2,3,4,10]中,x=3就符合题意。
分析: 这道题看上去很简单, 我第一印象就是直接遍历数组就可以啦。但是想想,有木有更好的解答呢? 二分查找给了我们很好的解决方案。
其实如果我们分析,数组最后一个元素如果a[x]<n,或者第一个元素a[0]>0,都不能找到结果
顺着这个思路,利用二分查找就有了如下的代码:
<span style="font-size:18px;">int findSpecialNumber(int A[],int n) { int left = 0; int right = n-1; int middle = 0; while(left<=right) { middle = (left+right)/2; if(A[middle]==middle) return middle; else if(A[middle]<middle) left = left + 1; else right = right - 1; } return -1; }</span>
该算法时间复杂度为O(log n),空间复杂度为O(1),比我们直接遍历数组优化很多。