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

2021-09-25 10:29:47 字數 892 閱讀 3451

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

你的演算法時間複雜度必須是 o(log n) 級別。

如果陣列中不存在目標值,返回 [-1, -1]。

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8

輸出: [3,4]

示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6

輸出: [-1,-1]

思路:使用兩次二分查詢法,第一次找到左邊界,第二次呼叫找到右邊界即可

1、第一次找第乙個不小於target的數

2、第二次找搜第乙個大於target的數

參考文章:

class solution 

if (nums[nright] != target) return bp;

bp[0] = nright;

nright = nums.size();

while (nleft < nright)//求的是第乙個大於target的數

bp[1] = nright - 1;

return bp;

}};

問:第二個解法找右邊境,end設成n而不是n-1是因為什麼?

答:因為兩次二分搜尋法的搜尋目的不同,第一次是要搜第乙個不小於target的數,相當於lower_bound,第二次要搜第乙個大於target的數,相當於upper_bound,舉個例子來說,比如當前陣列是,我們要搜尋8,如果left和right都初始化為0,while迴圈沒法進入;但你可能會說為啥不改為while(left <= right),這樣的話right = mid這塊可能會陷入死迴圈。

參考文章:

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...