easy,不过做起来没那么easy
一开始的分析没有涵盖到全部种类,只是单纯的把左右丢进递归,返回较小的值,但这样显然是不对的,因为当没有搜到的时候应该返回-1,-1永远是比较小的。另外一个犯得错误是丢进递归时没有缩减搜索域,导致无线地柜,堆栈溢出,自己还傻傻的找数组的问题。
整体思路:
- 二分查找基本思想
- 若nums[mid]==mid,此时只需要搜索左侧是否有魔术索引,若不存在,则当前索引就是结果
- 否侧,先搜索左侧,若左侧存在结果,返回左侧结果,若左侧不存在结果,则转向右侧搜索
class Solution
{
public:
int findMagicIndex(vector<int> &nums)
{
int n=nums.size();
if(n==0)return -1;
return find(0, n-1 , nums);
}
int find(int l, int r, vector<int> &nums)
{
int mid = (l + r) / 2, next;
if (l > r)
return -1;
if (nums[mid] == mid)
{
next = find(l, mid-1, nums);
if (next == -1)
return mid;
else
return next;
}
else
{
next = find(l, mid-1, nums);
if (next == -1)
return find(mid+1, r, nums);
else
return next;
}
return -1;
}
};