程序员面试金典 - 面试题 08.03. 魔术索引(二分递归)
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. 魔术索引(二分递归)相关推荐
- [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
[问题描述][简单] [解答思路] 1. 逐个查找 时间复杂度:O(N) 空间复杂度:O(1) public int findMagicIndex(int[] nums) {for (int i = ...
- 程序员面试金典 - 面试题 08.13. 堆箱子(DP)
1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...
- 程序员面试金典 - 面试题 10.03. 搜索旋转数组
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 搜索旋转数组.给定一个排序后的数组 ...
- 程序员面试金典 - 面试题 05.03. 翻转数位(位运算)
1. 题目 给定一个32位整数 num,你可以将一个数位从0变为1.请编写一个程序,找出你能够获得的最长的一串1的长度. 示例 1: 输入: num = 1775(11011101111) 输出: 8 ...
- 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 动态规划 1. 题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列. 机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍 ...
- 程序员面试金典 - 面试题 08.14. 布尔运算(区间动态规划)
1. 题目 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false).1 (true).& (AND). | (OR) 和 ^ (XOR) 符号组成. 实现一个函 ...
- 程序员面试金典 - 面试题 16.03. 交点(数学)
1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...
- 程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)
1. 题目 搜索旋转数组.给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详. 请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的.若有多个相同元素,返回索引值最小 ...
- 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
1. 题目 递归乘法. 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘. 可以使用加号.减号.位移,但要吝啬一些. 示例1:输入:A = 1, B = 10输出:10示例2:输入:A = ...
最新文章
- 伦理困境:人工智能浪潮与“AI威胁论”之争
- Ansible之playbook(剧本)介绍和配置详解
- php 变量的8类类型
- python 删除链表中的重复元素
- 客户关系管理系统-CRM源码
- 如何洞察行业中的应用场景?(下篇)
- 剖析java中的String之__拼接
- vant实现下拉刷新和上拉加载_微信小程序 - 实现下拉刷新、上拉加载
- Power BI 的 最佳搭档 Excel(基础数据分析)
- java处理表单变量_Java自学之SpringMVC:接收表单数据
- Linux日常运维(rsync通过服务连接,linux日志,screen)
- 解决重启centos后resolv.conf总被清空的问题
- 《Android游戏开发详解》一2.2 设置开发机器
- sqlserver 分割多个文件_鸿萌易备:SQL Server 数据库的全方位备份解决方案
- 如何处理计算机显卡故障,电脑显卡坏了怎么办?
- 《3D数学基础》1.7 向量的向量积
- OpenStack HA
- 与朋友谈心,也是与自己谈心
- 宁王比神联手,率锂电池和材料厂,决战锂矿
- RabbitMQ可视化界面登录不了,报错:Login failed