面试题 08.03. 魔术索引
难度:简单
题目描述
解题思路
1、暴力法
如果不想复杂的话就很简单嘛
public int findMagicIndex(int[] nums) {
for(int i = 0;i < nums.length;i++){
if(nums[i] == i){
return i;
}
}
return -1;
}
2、官方题解二分
看起来也不太像是二分的样子啊
public int findMagicIndex(int[] nums) {
return findHelper(nums, 0, nums.length-1);
}
public int findHelper(int[] nums,int left,int right) {
if(left > right) {
return -1;
}
int mid = left + (right-left)/2;
int leftAnswer = findHelper(nums, left, mid - 1);
//如果左边找到了,就返回结果
if (leftAnswer != -1) {
return leftAnswer;
} else if (nums[mid] == mid) {
return mid;
}
return findHelper(nums, mid + 1, right);
}
3、间隔跳跃查找
这种好像只能在升序的时候有用,但是测试用例里也没降序的用例,所以能过
//间隔跳跃查找
public int findMagicIndex1(int[] nums) {
for(int i=0;i<nums.length; ){
if(nums[i]==i)
return i;
i=Math.max(nums[i],i+1);
}
return -1;
}
比如[2, 2, 2, 4, 5]
下标0的地方是2,那么直接去下标为2的地方找,因为中间不可能有满足条件的了