「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。
二、思路分析
- 看看题目的示例,我们来理一理这个思路~
- 示例 1:
1 | ini复制代码 输入:nums = [0, 2, 3, 4, 5] |
- 示例2:
1 | ini复制代码 输入:nums = [1, 1, 1] |
- 说明
+ nums长度在[1, 1000000]之间
+ 此题为原书中的 Follow-up,即数组中可能包含重复元素的版本
- 老规矩,先跟着第一感觉走,暴力破解来一波!
三、AC 代码
- 暴力破解:
1 | arduino复制代码class Solution { |
- 执行结果:
这玩意应该不用解释了吧?
- 跳跃寻找法:
+ 我们可以看看题目的示例,可以理解为这个数组是`递增`、`可重复`的。
+ 也就是 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]都不会有符合条件的出现?
+ 完美,用这种方法试试看:
+ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
css复制代码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
本文转载自: 掘金