34 在排序陣列中查詢元素的第乙個和最後乙個位置

2021-10-03 00:08:45 字數 1269 閱讀 5278

給定乙個按照公升序排列的整數陣列 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...