题目
魔术索引。 在数组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]之间
此题为原书中的 Follow-up,即数组中可能包含重复元素的版本
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/magic-index-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路以及代码
1.暴力解法
思路:遍历数组 如果找到nums[i]==i就return,没有就继续,遍历完了还没有就返回-1
public int findMagicIndex(int[] nums) {
int res = -1;
for(int i = 0;i<nums.length;i++){
if(nums[i] == i){
res = i;
break;
}
}
return res;
}
2.二分法(数组是有序的)
思路:将数组分成左右两部分,每次都对比最中间的位置和下标,还要判断数组是否可在分,因为要输出最小下标的,所以即使找到符合条件的也都要往左找,直到左面不可分,然后在对比nums[mid]和mid
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);
}
3.收获
递归要素:
1.递归出口
2.递归体
ps:真是一年没用到递归了看到这个题解的时候想了好半天,递归思想就更别说了不复存在
各位大佬多提提意见呐