LeetCode(34)Search for a Range
2024-09-06 13:40:29
题目
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm’s runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
分析
给定一有序整数序列,与目标元素值,要求输出目标元素值在此序列中出现的范围下标。且复杂度控制在O(logn)内。
明显的,我们应该采取二分搜索的思想,设计求出关键字最早出现位置与最后出现位置,与普通的二叉搜索比较,只需要修改判断条件即可。
AC代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
if (nums.size() == 0)
{
ret.push_back(-1);
ret.push_back(-1);
return ret;
}
//寻找目标元素的下标
int pos = BinarySearch(nums, target);
//目标元素不存在
if (pos == -1)
{
ret.push_back(-1);
ret.push_back(-1);
return ret;
}
else{
int left = BinarySearchLeft(nums, 0, pos, target);
int right = BinarySearchRight(nums, pos, nums.size()-1 , target);
ret.push_back(left);
ret.push_back(right);
return ret;
}//if
}
int BinarySearch(vector<int> & nums, int target)
{
int left = 0, right = nums.size() - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
{
left = mid + 1;
continue;
}
else{
right = mid - 1;
continue;
}
}//while
return -1;
}
int BinarySearchLeft(vector<int> & nums, int left, int right, int target)
{
while (left < right)
{
int mid = (left + right) / 2;
if (nums[mid] == target && nums[mid-1] < target)
return mid;
else if (nums[mid] < target)
{
left = mid + 1;
continue;
}
else{
right = mid - 1;
continue;
}
}//while
return left;
}
int BinarySearchRight(vector<int> & nums, int left, int right, int target)
{
while (left < right)
{
int mid = (left + right) / 2;
if (nums[mid] == target && nums[mid + 1] > target)
return mid;
else if (nums[mid] <= target)
{
left = mid + 1;
continue;
}
else{
right = mid - 1;
continue;
}
}//while
return right;
}
};
最新文章
- Preconditions优雅的检验参数
- POJ2186 Popular Cows(强连通分量)
- HDU 1025-Constructing Roads In JGShining&#39;s Kingdom(最长不降子序列,线段树优化)
- 在Dashboard中显示课表/日程表
- 线段树求逆序数方法 HDU1394&;amp;&;amp;POJ2299
- g++编译cpp文件
- 我的第一本docker书-阅读笔记
- Swift、Objective-C 单例模式 (Singleton)
- __builtin_popcount(n)
- Linux通过shell执行自动化部署
- python3 re正则匹配数据获取案例
- Leetcode-颠倒整数
- CodeForces - 724G:Xor-matic Number of the Graph
- 先安装VS后安装IIS,注册IIS方法
- 从零开始学安全(十五)●DHCP服务
- VirtualBox下扩容vdi文件
- 使用antd-mobile的ImagePicker组件实现图片的上传
- Web服务架构风格之REST
- 【二分】【预处理】zoj4029 Now Loading!!!
- Django之Form组件验证