魔术索引 | LeetCode刷题笔记

1,421 阅读2分钟

「这是我参与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;
    }
}
  • 执行结果:

  • 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]都不会有符合条件的出现?
    • 完美,用这种方法试试看:

    • 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


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

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