【问题描述】[简单]

【解答思路】

1. 逐个查找

时间复杂度:O(N) 空间复杂度:O(1)

public int findMagicIndex(int[] nums) {for (int i = 0, length = nums.length; i < length; i++) {if (i == nums[i])return i;}return -1;}
2. 逐个查找优化

有序升序整数
假如nums[0]=100,假如是升序的,那么num[0]后面的值都不会比100小,所以i如果还是一步步的加,效率肯不高,我们直接让i从100开始,因为小于100的i肯定是查找不到的。

时间复杂度:O(N) 空间复杂度:O(1)

    public int findMagicIndex(int[] nums) {for (int i = 0, length = nums.length; i < length; i++) {if (i == nums[i])return i;if (nums[i] > i + 1) {//如果nums[i]大于i+1,我们就让i加上nums[i] - 1,// 这里减1的目的是为了抵消上面for循环中的i++。//这里判断的时候为什么是nums[i] > i + 1而不是//nums[i] > i ,因为如果num[i]只比i大1的话,//直接执行上面的i++就可以了,没必要再执行下面的计算i = nums[i] - 1;}}return -1;}
3. 递归

一想到排序数组很容易想到的是二分法查找,但是这里如果直接使用二分法查找的i不一定是最小的,有重复的数字。
[0,0,2,2,5] 存在多个满足
所以有一种方式就是先把数组劈两半,先在前面一半查,如果找到就直接返回,如果没找到就在后面部分查,并且前面部分和后面部分再分别劈两半,一直这样递归下去……。

时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int findMagicIndex(int[] nums) {return getAnswer(nums, 0, nums.length - 1);}public int getAnswer(int[] nums, int left, int right) {if (left > right) {return -1;}int mid = (right - left) / 2 + left;int leftAnswer = getAnswer(nums, left, mid - 1);if (leftAnswer != -1) {return leftAnswer;} else if (nums[mid] == mid) {return mid;}return getAnswer(nums, mid + 1, right);}
}

【总结】

暴力容易想到 也容易想到二分 但没想到它是不能直接用二分,而只能用二分剪枝的思想 直接使用二分一定要单调递增或递减

转载链接:https://leetcode-cn.com/problems/magic-index-lcci/solution/zhu-ge-cha-zhao-yi-ji-you-hua-di-gui-you-hua-ji-di/
参考链接:https://leetcode-cn.com/problems/magic-index-lcci/solution/mo-zhu-suo-yin-by-leetcode-solution/

[Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]相关推荐

  1. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

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

    1. 题目 魔术索引. 在数组A[0-n-1]中,有所谓的魔术索引,满足条件A[i] = i. 给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回- ...

  3. [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]

    [问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...

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

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

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

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

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

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

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

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

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

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

  9. 程序员面试金典 - 面试题 08.11. 硬币(背包DP)

    文章目录 1. 题目 2. 解题 1. 题目 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算 n 分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示 ...

最新文章

  1. matlab二阶导数表示,【单选题】在MATLAB符号计算中,y的二阶导数表示为( )。...
  2. dnf mysql数据库密码,CentOS7使用dnf安装mysql的方法
  3. 题解 T28305 【yizimi的旅游景点】
  4. 算法岗面试前怎样高效刷题?
  5. python学习Day7 数据类型的转换,字符编码演变历程
  6. 【note】Java程序设计基础第五版(上)
  7. kafka--Struct Streaming--hdfs案例
  8. 【信号处理】基于高阶统计量特征的通信系统中微弱信号检测附matlab代码
  9. python编程之TypeError: list expected at most 1 arguments, got 7
  10. @ResponseStatus的作用
  11. solr自带智能拼音收藏
  12. CS架构客户端软件升级方案
  13. 大数据时代的小数字感:数据再有价值,别人听不懂照样没用
  14. PostgreSQL12.3——pgAdmin4表格的创建
  15. Kubernetes K8S之存储Volume详解
  16. python爬虫爬取股票软件数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转载)...
  17. Spring整合JPA
  18. 必学比知性能指标和常用术语
  19. android 变windows7,安卓手机变电脑(iDisplay) v3.1.0 英文安装版 Win7/WinXP
  20. yaml语法 关于key为中文时的问题

热门文章

  1. C++程序设计语言(特别版) -- 一个桌面计算器
  2. python 进程和线程
  3. 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)
  4. 如何给微软提反馈建议以及bug
  5. php ajax session死锁,session过期,ajax请求处理
  6. TFS2010 删除工作区(同时删除工作区中所有的目录映射)
  7. echarts生成图表
  8. php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
  9. pycharm自带python环境_Pycharm安装+python安装+环境配置
  10. 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结