「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
魔术索引。 在数组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,即数组中可能包含重复元素的版本
-
老规矩,先跟着第一感觉走,暴力破解来一波!
三、AC 代码
- 暴力破解:
class Solution {
public int findMagicIndex(int[] nums) {
for(int i=0;i<nums.length;i++){
if(i==nums[i]){
return i;
}
}
return -1;
}
}
-
执行结果:
-
这玩意应该不用解释了吧?
-
跳跃寻找法:
-
我们可以看看题目的示例,可以理解为这个数组是
递增
、可重复
的。 -
也就是 num[i] 一定大于等于 num[i-1] 的。
-
那么这样我们是不是可以理解为:当num[i] > i(即当前下标),那么一直到这个num[i] 这个数都不符合条件?
-
举例:
- num[] = {1,2,3,8,9,11};
- num[1] = 2 > 1
- num[2] = 3 : 这个3肯定是大于2的吧?也就是百分百不符合条件
- 以此类推
- num[3]=8 >3 :是不是一直到num[8]都不会有符合条件的出现?
-
完美,用这种方法试试看:
-
class Solution { public int findMagicIndex(int[] nums) { int i = 0; while (i < nums.length) { if (nums[i] == i) { return i; } else if (nums[i] > i) { //当nums[i] > i,进行跳跃,如果i>nums.length证明无符合条件,返回-1 i = nums[i]; }else{ i++; } } return -1; } }
-
执行结果:
-
-
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah