您的位置:首页 > 职场人生

面试题(魔术索引)

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: