給定一個排序數組和一個目标值,在數組中找到目标值,并傳回其索引。如果目标值不存在于數組中,傳回它将會被按順序插入的位置。這就是搜尋插入位置算法。與二分算法很相似
示例 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
var searchInsert = function(nums, target) {
let left = 0,right = nums.length -1 ,n = nums.length
while (left <= right) {
let mid = (left + right) >> 1
if(nums[mid] >= target) {
// 值在左側
n = mid
right = mid - 1
}else {
// 右側
left = mid + 1
}
}
return n
};
解題如上。此題的解題方案如下:
1. 根據題頭我們可以知道這是一個排序好的數組。是以我們直接可以基于二分查找來進行坐。
2. 我們在數組中找到目标值,傳回其索引,跟之前二分查找的時候是一緻的。
3. 如果目标值不存在數組中,那麼傳回它會被插入的位置。這裡可以的了解就是,分為兩種,
- 第一種,target 的值是在數組中的,這時候我們利用二分可以找到最近的下标,傳回出去即可解答。
- 第二種,target的值不在數組中,也就是說數組中沒有。如何進行呢?
假設數組為: [1,2,3,4,5,6] target 為 0 ,預設抛出的值 N 為 0
這樣的話,我們通過三次二分就可以發現1的坐标為0.即 我們找尋最接近的值的下标則為0.
但是如果我們的 target 為 7 呢。 這時候會發現測試用例走不過去了。
這是什麼願意呢?是因為,我們的target為7,則依舊需要三次二分。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM3ADM5YmZ5MjM3IDN2UjNzYzX5MjMxMDM1AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
第一次二分後的中間值是2,第二次4 ,第三次5.但是它依舊沒有找到位置。說明方法沒進入,這時候如果初始化 N 是 0 的話,則方法會直接傳回 0 造成錯誤。這時候大家明白了吧。