携手创作,共同成长!这是我参与「掘金日新计划 · 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即可。
方法二
- 寻找数组的第一个下标,首先想到的就会是
findIndex方法; findIndex的功效就是寻找数组中满足条件的第一个元素下标,若没有满足条件的,则返回-1;- 按照这个描述,是完全满足符合题意的;
findIndex接收三个参数,当前元素、当前下标以及元素本身,那么可以很方便的写出条件函数item === index;- 返回
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