在排序数组中查找第一个元素和最后一个元素(二分法)

题目描述

给定一个按照升序排列的整数数组 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]

链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
解题思路

首先根据这是一个已经排序好的数组来使用二分法查找出最左边的值l使得nums[l] == target和最右边的值r使得nums[r] > target.可通过两次查找得到。

代码实现

 1 class Solution {
 2 public:
 3     vector<int> pos = vector<int>(2, -1);
 4     //单次寻找最左边的起始位置,或者结束的位置+1
 5     int binarySearch(vector<int>& nums, int target, bool lower){
 6         int n = nums.size();
 7         int ans = n;
 8         int l = 0, r = n - 1;
 9         while(l <= r){
10             int mid = (l + r)/2;
11             //如果lower == true, 表示nums[mid]>=target,表示寻找最小的mid值使得nums[mid] == target
12             //如果lower == false, 表示nums[mid]>target,表示寻找最小的mid值使得nums[mid] > target
13             if(nums[mid] > target || (lower && nums[mid] == target)){
14                 r = mid - 1;
15                 ans = mid;
16             }
17             
18             else{
19                 l = mid + 1;
20             }
21         }
22         return ans;
23     }
24     vector<int> searchRange(vector<int>& nums, int target) {
25         int n = nums.size();
26         int l = binarySearch(nums, target, true);
27         int r = binarySearch(nums, target, false) - 1;
28         //cout<< l <<" " << r << endl;
29         if(l > r || l >= n || r >= n || l < 0 || r < 0 ){
30             return pos;
31         }
32         else{
33             pos[0] = l;
34             pos[1] = r;
35             return pos;
36         }
37     }
38 };
原文地址:https://www.cnblogs.com/latencytime/p/14612745.html