LeetCode 算法:魔术索引

557 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 5 天,点击查看活动详情

魔术索引

原题地址

魔术索引。 在数组 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,即数组中可能包含重复元素的版本

思路分析

方法一

  1. 还是使用比较暴力的数组遍历的方式;
  2. 遍历数组,判断当前数组的值与下标是否相同,若相同返回对应下标即可,因为是寻找最小的下标,所以可以这样寻找,找到一个即可;
  3. 若整个遍历过程中没有返回值,则返回 -1 即可。

方法二

  1. 寻找数组的第一个下标,首先想到的就会是 findIndex 方法;
  2. findIndex 的功效就是寻找数组中满足条件的第一个元素下标,若没有满足条件的,则返回 -1
  3. 按照这个描述,是完全满足符合题意的;
  4. findIndex 接收三个参数,当前元素、当前下标以及元素本身,那么可以很方便的写出条件函数 item === index;
  5. 返回 findIndex 得到的结果即可。

AC 代码

方法一

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMagicIndex = function(nums) {
    for(let i = 0; i < nums.length; i++) {
        if(i === nums[i]) {
            return i
        }
    }
    return -1
};

结果:

  • 执行结果: 通过
  • 执行用时:64 ms, 在所有 JavaScript 提交中击败了51.72%的用户
  • 内存消耗:41.9 MB, 在所有 JavaScript 提交中击败了38.79%的用户
  • 通过测试用例:40 / 40

方法二

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMagicIndex = function(nums) {
    return nums.findIndex((item, index) => item === index)
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了15.13%的用户
  • 内存消耗:41.8 MB, 在所有 JavaScript 提交中击败了73.95%的用户
  • 通过测试用例:40 / 40

END