34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
作者:互联网
34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
进阶:
- 你可以设计并实现时间复杂度为
O(log n)
的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10]
, target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10]
, target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
1 class Solution { 2 public: 3 int findTheFirstPos(vector<int> &nums, int target){ 4 int n = nums.size(); 5 int left = 0; 6 int right = n - 1; 7 while (left < right) { 8 int mid = left + (right - left) / 2; 9 if (nums[mid] < target) { 10 // 下一轮搜索的区间为[mid + 1, right] 11 left = mid + 1; 12 } else if (nums[mid] ==target) { 13 // 下一轮搜索的区间为[left, mid] 14 right = mid; 15 } else { 16 // nums[mid] > target,下一轮搜索的区间为[left, mid - 1] 17 right = mid - 1; 18 } 19 } 20 if (nums[left] == target) { 21 return left; 22 } 23 return -1; 24 } 25 int findTheLastPos(vector<int> &nums, int target){ 26 int n = nums.size(); 27 int left = 0; 28 int right = n - 1; 29 while (left < right) { 30 int mid = left + (right - left + 1) / 2; 31 if (nums[mid] < target) { 32 // 下一轮搜索的区间为[mid + 1, right] 33 left = mid + 1; 34 } else if (nums[mid] ==target) { 35 // 下一轮搜索的区间为[mid, right] 36 left = mid; 37 } else { 38 // nums[mid] > target,下一轮搜索的区间为[left, mid - 1] 39 right = mid - 1; 40 } 41 } 42 return left; 43 } 44 vector<int> searchRange(vector<int>& nums, int target) { 45 if (nums.empty()) { 46 return {-1, -1}; 47 } 48 int first = findTheFirstPos(nums, target); 49 if (first == -1) { 50 return {-1, -1}; 51 } 52 int last = findTheLastPos(nums, target); 53 return {first, last}; 54 } 55 };
标签:二分,right,target,nums,int,mid,34,查找,left 来源: https://www.cnblogs.com/MGFangel/p/16201308.html