2022-11-17
Leetcode
00

目录

1. 题目
2. 二分法解

1. 题目

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

请必须使用时间复杂度为 O(log n) 的算法。

  • 示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
  • 示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
  • 示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
  • 示例 4:
输入: nums = [1,3,5,6], target = 0 输出: 0
  • 示例 5:
输入: nums = [1], target = 0 输出: 0
  • 提示:
    • 1 <= nums.length <= 104
    • -104 <= nums[i] <= 104
    • nums 为无重复元素的升序排列数组
    • -104 <= target <= 104

2. 二分法解

解题思路:题干中有明确说用请必须使用时间复杂度为 O(log n) 的算法,如果用循环遍历数组就是O(n)了,肯定那不行,而在有序数组的查找中 O(logn)的时间复杂度 最先想到的当然是二分查找法了。

javascript
/** * @param {number[]} nums * @param {number} target * @return {number} */ var searchInsert = function(nums, target) { let left = 0, right = nums.length - 1 while(left <= right) { const mid = (left + right) >> 1 if(nums[mid] === target) { return mid } else if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid + 1 } } return left }

我们以nums = [1,3,5,6], target = 7为例

  • 第一次循环: left=0 right=3 mid=1 nums[mid]=3<7
  • 第二次循环: left=2 right=3 mid=2 nums[mid]=5<7
  • 第三次循环: left=3 right=3 mid=3 nums[mid]=6<7
  • 第四次循环: left=4 right=3 left > right 跳出循环 没找到返回left

image.png

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:叶继伟

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!