魔术索引 LeetCode刷题笔记 二、思路分析 三、A

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


魔术索引

魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。

二、思路分析


  • 看看题目的示例,我们来理一理这个思路~
  • 示例 1:
1
2
3
ini复制代码 输入:nums = [0, 2, 3, 4, 5]
输出:0
说明: 0下标的元素为0
  • 示例2:
1
2
ini复制代码 输入:nums = [1, 1, 1]
输出:1
  • 说明
+ nums长度在[1, 1000000]之间
+ 此题为原书中的 Follow-up,即数组中可能包含重复元素的版本
  • 老规矩,先跟着第一感觉走,暴力破解来一波!

三、AC 代码


  • 暴力破解:
1
2
3
4
5
6
7
8
9
10
arduino复制代码class Solution {
   public int findMagicIndex(int[] nums) {
       for(int i=0;i<nums.length;i++){
           if(i==nums[i]){
               return i;
          }
      }
       return -1;
  }
}
  • 执行结果:
  • image-20211108204312974.png

这玩意应该不用解释了吧?

  • 跳跃寻找法:
+ 我们可以看看题目的示例,可以理解为这个数组是`递增`、`可重复`的。
+ 也就是 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;
  }
}
+ 执行结果: + ![image-20211108205708389.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/bd7dd4b9c38cb2bd5f875401c768388586ad83c7e1c3cebc51b55ffca399054e)

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%