給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。
你的演算法時間複雜度必須是 o(log n) 級別。
如果陣列中不存在目標值,返回 [-1, -1]。
示例 1:
示例 2:
可以用二分查詢找出第乙個位置和最後乙個位置,但是尋找的方法有所不同,需要實現兩個二分查詢。我們將尋找 target 最後乙個位置,轉換成尋找 target+1 第乙個位置,再往前移動乙個位置。這樣我們只需要實現乙個二分查詢**即可。
在尋找第乙個位置的二分查詢**中,需要注意 right 的取值為 nums.size(),而不是 nums.size()- 1。先看以下示例:
nums = [2,2], target = 2
如果right 的取值為 nums.size() - 1,那麼 last = findfirst(nums, target + 1) - 1 = 1 - 1 = 0。這是因為 findfirst 只會返回 [0, nums.size() - 1] 範圍的值,對於 findfirst([2,2], 3) ,我們希望返回 3 插入 nums 中的位置,也就是陣列最後乙個位置再往後乙個位置,即 nums.size()。所以我們需要將right取值為 nums.size(),從而使得 findfirst返回的區間更大,能夠覆蓋 target 大於 nums 最後乙個元素的情況。
class
solution;}
int first =
findfirst
(nums, target)
;int last =
findfirst
(nums, target +1)
-1;if
(first == nums.
size()
|| nums[first]
!= target);}
return;}
intfindfirst
(vector<
int>
& nums,
int target)
else
}return left;}}
;
時間複雜度:o(logn)
空間複雜度:o(1)
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是o log n 級別。如果陣列中不存在目標值,返回 1,1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 輸入 nums 5,7,7,...
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8輸出 3,4 示例 2 輸入 n...
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8輸出 3,4 示例 2 輸入 n...