Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
脑子复健运动
题目
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为Ologn的算法解决此问题。
示例 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]
解题
看时间复杂度就是在说用二分用二分用二分
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> res;//数组为空直接返回if(nums.size()==0){res.push_back(-1);res.push_back(-1);return res;}//找相同值的左位置int l=0, r=nums.size()-1;while(l<r){int mid = l+(r-l)/2;if(nums[mid]>=target){ //取r等于r=mid;}else{l=mid+1;}}//如果找不到,直接返回[-1,-1]if(nums[l]!=target){res.push_back(-1);res.push_back(-1);return res;} //如果能找到,向res内加入值的左位置res.push_back(l);//继续找相同值的右位置l=0, r=nums.size()-1;while(l<r){int mid = l+(r-l)/2+1; //这里需要+1,否则最后无限循环 if(nums[mid]<=target){ //取l等于 l=mid;}else{r=mid-1;}}res.push_back(r); //加入值的右位置(l和r一样)return res;}
};
运行通过贴一个