面试题(魔术索引)
2020-07-31 11:50
447 查看
题目:魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。
示例1:
输入:nums = [0, 2, 3, 4, 5]
输出:0
说明: 0下标的元素为0
题解(一):最简单的方法就是遍历数组,找到魔术索引后就返回
class Solution { public int findMagicIndex(int[] nums) { for(int i=0;i<nums.length;i++){ if(i==nums[i])return i; } return -1; } }
题解(二):用二分法进行查找,用二分法时要注意由于可能有多个魔术索引的存在,所以我们在找到一个魔术索引后并不意味着结束,还要再魔术索引的左侧找更小的魔术索引
class Solution { public int findMagicIndex(int[] nums) { return findMinIndex(0,nums.length-1,nums); } private int findMinIndex(int left,int right,int[]nums){ int mid=(left+right)/2; if(mid==left){ if(nums[left]==left) return left; else if(nums[right]==right) return right; else return -1; } if(nums[mid]==mid) return findMinIndex(left,mid,nums)==-1?mid:findMinIndex(left,mid,nums); else return findMinIndex(left,mid,nums)==-1? findMinIndex(mid,right,nums):findMinIndex(left,mid,nums); } }
这道题是一道基础题的改编题,这样改编之后实际上题解(一)的遍历法和题解(二)的改良二分法时间复杂度上没有差别,但是对于原基础题(数组中不能有重复的元素)就能看出二分法的时间复杂度要优于遍历了
二分法代码:
class Solution { public int findMinIndex(int[]nums) { int left=0,right= nums.length-1; int mid = (left + right) / 2; while(mid!=left){ if(nums[mid]>=mid){ right=mid; mid = (left + right) / 2; } else{ left=mid; mid = (left + right) / 2; } } if(nums[left]==left) return left; else if(nums[right]==right) return right; else return -1; } }
相关文章推荐
- leetcode面试题 08.03. 魔术索引(二分)
- 面试题- 索引2
- 2014阿里实习生面试题——mysql如何实现索引的
- CCI 9.3 魔术索引
- CBO的魔术 - 一个错误的索引选择会带来的后果
- 一道关于索引的使用和key_len的计算的面试题
- 在数组A中找出一个魔术索引
- 循环删除指定索引位置一道面试题算法
- JAVA面试题06-Mysql索引
- 面试题二:索引问题
- 机器学习面试题-索引
- 索引常考面试题
- 循环删除指定索引位置一道面试题算法(2)
- 面试题 数据库中索引的作用 为什么不能每一列都设置为索引
- 腾讯php面试题总结(一) 15个魔术方法的总结
- 2014阿里实习生面试题——MySQL如何实现索引的
- MySQL常见面试题索引、表设计
- mysql索引优化面试题
- 2014阿里实习生面试题——mysql如何实现索引的.
- 一个索引的面试题