JS leetcode 搜索插入位置 题解分析

壹 ? 引

今天来做一道特别特别简单的题,来自leetcode35. 搜索插入位置,题目描述如下:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

输入: [1,3,5,6], 0
输出: 0

我们来直接分析题目,给出解题思路:

贰 ? 解题思路

根据题目描述,我们已知数组为从小到大排列且无重复元素的有序序列,给定一个目标值,我们要找到第一个等于或大于它的元素的索引。

为什么是大于或等于呢,等于不用解释,比如第二个例子[1,3,5,6]给定2,最终返回1,其实本质等于找到了第一个大于2的元素3,让3往后靠靠,再把2插入进去,而2正是取代了原先3的位置。

JS leetcode 搜索插入位置 题解分析

当然,如果我们遍历了一遍都没找到符合的位置,则插入到数组的末尾,所以这里返回的就是数组的长度。

知道了思路,那实现起来就很简单了,比如:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function (nums, target) {
    for (var i = 0; i < nums.length; i++) {
        // 大于等于目标值则返回索引
        if (nums[i] >= target) {
            return i
        };
    };
    // 反之返回length
    return nums.length;
};

当然,我最初想到的是find方法,由于长时间未用find有点陌生,导致我写了奇怪的代码:

// 这是错误的示例
var searchInsert = function (nums, target) {
    var result = nums.find((item, index) => {
        if (item >= target) {
            return index;
        };
    });
    return result ? result : nums.length;
};

这里我其实希望如果符合条件,就返回index给result,如果没找到result为undefined,所以利用这点来决定返回length或者是正确的index。

但事实上find方法的特性是如下:

  • 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
  • 如果没有符合条件的元素返回 undefined。

注意,是为 true 时 返回符合条件的元素,所以这里即使我们写了return index,也不会返回index,而是以index转为布尔值,来决定是否要返回当前item。所以上述的代码无法按照我们的预期找到想要的索引。

当然,按照上面的思路,我们应该使用findIndex而非find,findIndex与find相同,同样是根据返回的布尔值决定是否要返回当前索引,如果遍历完成未找到,则返回-1,正确的代码是这样:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function (nums, target) {
    var result = nums.findIndex((item) => {
        return item >= target;
    });
    return result === -1 ? nums.length : result;
};

那么关于本题的分析就到这里了。

JS leetcode 搜索插入位置 题解分析

上一篇:[Go] 自定义一些http Server的参数 用到了interface的一些特性


下一篇:NetCore 使用 iTextSharp 读取 PDF 中的文字信息