LeetCode 34. 搜索范围(search for a range)
2024-08-31 17:50:48
题目描述
给定一个按照升序排列的整数数组 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]
解题思路
利用二分查找的思想,分别找到数组中target出现的首位置和末位置,其中找首位置的步骤如下:
- 若数组中点值小于target,继续在中点值之后的数组查找
- 若数组中点值大于或等于target,说明前面数组中还可能有target,继续在中点值之前的数组查找
- 最后当首位置大于末位置时,首位置即为数组中第一个大于或等于target的值
- 若首位置上的数与target相等,则返回该位置,否则返回-1
同理可得到找末位置的步骤。
代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty())
return {-,-};
int first=findFirst(nums,target);
int last=findLast(nums,target);
return {first,last};
}
int findFirst(vector<int>& nums, int target){
int f=,l=nums.size()-;
while(f<=l){
int m=(f+l)/;
if(nums[m]<target)
f=m+;
else
l=m-;
}
if(f<nums.size()&&nums[f]==target)
return f;
return -;
}
int findLast(vector<int>& nums, int target){
int f=,l=nums.size()-;
while(f<=l){
int m=(f+l)/;
if(nums[m]<=target)
f=m+;
else
l=m-;
}
if(l>=&&nums[l]==target)
return l;
return -;
}
};
最新文章
- (免量产,免格式化)手动将PE安装到移动硬盘/U盘或无系统硬盘!
- struts2拦截器+监听器 .
- BAT批量处理 命令
- 使用Jquery解析Json基础知识
- Android--自动搜索提示
- Giew与checkBox的结合
- 动漫网站基于jquery的横向手风琴特效
- topcoder srm 610 div2 250
- C51指针小结
- js调试
- 论山寨手机与Android联姻 【4】手机产业链
- printk
- Centos6.5部署vsftpd+mysql认证
- 安装pycrypto2.6.1报错
- JSON与XML之间的转换
- 怎样在winform中上传图片
- [Windows Hook] 屏蔽键盘按键
- 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组
- Linux下eclipse编译C/C++程序遇到 undefined reference to `pthread_create&#39;的异常解决办法
- Javascript常用语法 (一)