1. 题目

魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i

给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。
若有多个魔术索引,返回索引值最小的一个。

示例1:输入:nums = [0, 2, 3, 4, 5]输出:0说明: 0下标的元素为0示例2:输入:nums = [1, 1, 1]输出:1提示:
nums长度在[1, 1000000]之间

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/magic-index-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 二分法,如果找到中点满足,还需在左半部分继续找
  • 中点不满足,两侧查找
  • 当找到了一个idx以后,区间的端点需要小于idx,才继续找
class Solution {bool foundOne = false;int idx = INT_MAX;
public:int findMagicIndex(vector<int>& nums) {findidx(nums,0,nums.size()-1);if(idx == INT_MAX)return -1;return idx;}void findidx(vector<int>& nums,int l, int r){if(l > r)return;int mid = l+((r-l)>>1);if(nums[mid] == mid){idx = min(idx, mid);foundOne = true;}if(foundOne){   if(idx > l)findidx(nums,l,mid-1);}else{findidx(nums,l,mid-1);findidx(nums,mid+1,r);}}
};

  • 下面的解法也很新鲜
class Solution {public:int findMagicIndex(vector<int>& nums) {int idx = 0;while(idx < nums.size()){if(nums[idx] == idx)return idx;else if(nums[idx] > idx)//【0】=5,那么后面直接跳到5处idx = nums[idx];elseidx++;}return -1;}
};

程序员面试金典 - 面试题 08.03. 魔术索引(二分递归)相关推荐

  1. [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]

    [问题描述][简单] [解答思路] 1. 逐个查找 时间复杂度:O(N) 空间复杂度:O(1) public int findMagicIndex(int[] nums) {for (int i = ...

  2. 程序员面试金典 - 面试题 08.13. 堆箱子(DP)

    1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...

  3. 程序员面试金典 - 面试题 10.03. 搜索旋转数组

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 搜索旋转数组.给定一个排序后的数组 ...

  4. 程序员面试金典 - 面试题 05.03. 翻转数位(位运算)

    1. 题目 给定一个32位整数 num,你可以将一个数位从0变为1.请编写一个程序,找出你能够获得的最长的一串1的长度. 示例 1: 输入: num = 1775(11011101111) 输出: 8 ...

  5. 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 动态规划 1. 题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列. 机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍 ...

  6. 程序员面试金典 - 面试题 08.14. 布尔运算(区间动态规划)

    1. 题目 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false).1 (true).& (AND). | (OR) 和 ^ (XOR) 符号组成. 实现一个函 ...

  7. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

  8. 程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)

    1. 题目 搜索旋转数组.给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详. 请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的.若有多个相同元素,返回索引值最小 ...

  9. 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)

    1. 题目 递归乘法. 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘. 可以使用加号.减号.位移,但要吝啬一些. 示例1:输入:A = 1, B = 10输出:10示例2:输入:A = ...

最新文章

  1. 伦理困境:人工智能浪潮与“AI威胁论”之争
  2. Ansible之playbook(剧本)介绍和配置详解
  3. php 变量的8类类型
  4. python 删除链表中的重复元素
  5. 客户关系管理系统-CRM源码
  6. 如何洞察行业中的应用场景?(下篇)
  7. 剖析java中的String之__拼接
  8. vant实现下拉刷新和上拉加载_微信小程序 - 实现下拉刷新、上拉加载
  9. Power BI 的 最佳搭档 Excel(基础数据分析)
  10. java处理表单变量_Java自学之SpringMVC:接收表单数据
  11. Linux日常运维(rsync通过服务连接,linux日志,screen)
  12. 解决重启centos后resolv.conf总被清空的问题
  13. 《Android游戏开发详解》一2.2 设置开发机器
  14. sqlserver 分割多个文件_鸿萌易备:SQL Server 数据库的全方位备份解决方案
  15. 如何处理计算机显卡故障,电脑显卡坏了怎么办?
  16. 《3D数学基础》1.7 向量的向量积
  17. OpenStack HA
  18. 与朋友谈心,也是与自己谈心
  19. 宁王比神联手,率锂电池和材料厂,决战锂矿
  20. RabbitMQ可视化界面登录不了,报错:Login failed

热门文章

  1. java统计系统线程数_Java并发(八)计算线程池最佳线程数
  2. ctypes python_[python学习之路]ctypes,Python
  3. 更新10_linux,时隔十年,QQ更新了Linux版本
  4. web前端细解cookie那些事
  5. LC-BLSTM结构快速解读
  6. [转载]我的WafBypass之道(upload篇)
  7. plsql 中的一些好的设置和快捷键总结
  8. C# Excel处理工具
  9. Ubuntu编写开机自启动脚本(转载)
  10. RTOS 任务间互斥的难题