题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
代码片
/*
* @lc app=leetcode.cn id=35 lang=javascript
*
* [35] 搜索插入位置
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
* 左闭右闭区间代码实现
*/
var searchInsert = function (nums, target) {
if (nums == null || !nums.length) {
return -1;
}
// 左闭右闭区间
let begin = 0,
end = nums.length-1;
while (begin <= end) {
// 下面这样写是考虑大数情况下避免溢出
let mid = begin + ((end - begin) >> 1);
if (nums[mid] > target) {
// 在左半区间中查找
end = mid - 1;
} else if (nums[mid] < target) {
// 在右半区间中查找
begin = mid + 1;
} else {
// 正好就是
return mid;
}
}
// 查找的是左边界,所以返回begin
return begin;
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
* 左闭右开区间代码实现
*/
var searchInsert = function (nums, target) {
if (nums == null || !nums.length) {
return -1;
}
// 左闭右开区间
let begin = 0,
end = nums.length;
// 左闭右开
while (begin < end) {
// 下面这样写是考虑大数情况下避免溢出
let mid = begin + ((end - begin) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
// 在右半区间中查找
begin = mid + 1;
} else {
// 在左半区间中查找
end = mid;
}
}
// 查找的是左边界,所以返回begin
return begin;
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
* 左闭右开区间简化版本
*/
var searchInsert = function (nums, target) {
let left = 0,
right = nums.length;
// 左闭右开区间
while (left < right) {
let mid = left + ((right - left) >> 1);
// 如果中间值比目标值大 则在左半部查找
if (nums[mid] >= target) right = mid;
else left = mid + 1;
}
return left;
};