LeetCode 面试题08.03 每日一题 Day22.

24 篇文章 0 订阅
22 篇文章 0 订阅

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值