給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。
你可以假設陣列中無重複元素。
示例 1:
輸入: [1,3,5,6], 5示例 2:輸出: 2
輸入: [1,3,5,6], 2示例 3:輸出: 1
輸入: [1,3,5,6], 7示例 4:輸出: 4
輸入: [1,3,5,6], 0思路分析:輸出: 0
如果該題目暴力解決的話需要o(n)的時間複雜度,但是如果二分的話則可以降低到o(logn)的時間複雜度;
整體思路和普通的二分查詢幾乎沒有區別,先設定左側下標left和右側下標right,再計算中間下標mid;
每次根據nums[mid]和target之間的大小進行判斷,相等則直接返回下標,nums[mid]target則right左移。這樣來縮小搜尋範圍;
查詢結束如果沒有相等值則返回left,該值為插入位置;
時間複雜度:o(logn)
二分查詢的思路不難理解,但是邊界條件容易出錯,比如迴圈結束條件中left和right的關係,更新left和right位置時要不要加1減1。
這裡我們可以拿幾個例子來測試邊界值,多試幾次就行了。
class
solution
else
if(nums[mid]
< target)
else
}return left;
}}
當然,記住二分的模板會事半功倍!煩人的邊界值也不會出錯。
模板一:
class
solution
else
if(nums[mid]
< target)
else
}// 相關返回值
return0;
}}
模板二
class
solution
else
if(nums[mid]
< target)
else
}// 相關返回值
return0;
}}
參考: 35 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...
35 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...
35 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...