返回

LeetCode 35. 搜索插入位置 - JavaScript 攻克指南

前端

前言

欢迎来到LeetCode 35题的JavaScript解题指南!本题旨在考察您对排序数组和二分查找算法的理解。我们将共同探索如何有效地找到目标值在数组中的位置,或确定其应被插入的位置。

题目概述

给定一个已排序的数组nums和一个目标值target,您的任务是找到target在nums中的索引。如果target不存在于nums中,您需要返回它将会被按顺序插入的位置。

例如:

输入:nums = [1,3,5,6], target = 5
输出:2
输入:nums = [1,3,5,6], target = 2
输出:1
输入:nums = [1,3,5,6], target = 7
输出:4

算法分析

本题的经典解法是使用二分查找算法。二分查找是一种高效的搜索算法,它通过不断地将搜索范围减半来快速找到目标值。

二分查找算法的步骤如下:

  1. 初始化左右指针left和right,分别指向数组nums的第一个元素和最后一个元素。
  2. 计算中间指针mid,将其设置为(left + right) / 2。
  3. 比较nums[mid]和target的大小:
    • 如果nums[mid] == target,则返回mid。
    • 如果nums[mid] > target,则将right更新为mid - 1。
    • 如果nums[mid] < target,则将left更新为mid + 1。
  4. 重复步骤2和步骤3,直到left > right。
  5. 返回right + 1,表示target应被插入的位置。

JavaScript代码实现

/**
 * 给定一个已排序的数组和一个目标值,找到目标值在数组中的索引。
 * 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
 *
 * @param {number[]} nums 已排序的数组
 * @param {number} target 目标值
 * @return {number} 目标值在数组中的索引,或其应被插入的位置
 */
const searchInsert = (nums, target) => {
  let left = 0;
  let right = nums.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return right + 1;
};

复杂度分析

  • 时间复杂度:O(log n),其中n是数组nums的长度。二分查找算法的时间复杂度为O(log n),因为在每次迭代中,搜索范围都会减半。
  • 空间复杂度:O(1),因为二分查找算法不需要额外的空间。

结语

LeetCode 35题是一道经典的算法题,考察您对二分查找算法的掌握程度。通过本指南,您已经学会了如何使用JavaScript轻松解决这道题目。希望您在LeetCode的征途中继续取得佳绩!