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