区间查找
时间:2022-06-08
本文章向大家介绍区间查找,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端 点],如果target在nums里未出现,则返回[-1, -1]。 LeetCode 34. Search for a Range
思考
1.可否直接通过二分查找,很容易同时求出目标target所在区 间的左右端点? 2.若无法同时求出区间左右端点,将对目标target的二分查找 增加怎样的限制条件,就可分别求出目标target所在区间 的左端点与右端点?
算法设计
查找区间左端点时,增加如下限制条件: 当target == nums[mid]时,若此时mid == 0或nums[mid-1] < target,则说明mid即 为区间左端点,返回;否则设置区间右端点为mid-1。
查找区间右端点时,增加如下限制条件: 当target == nums[mid]时,若此时mid == nums.size() – 1或 nums[mid + 1] > target ,则说明mid即为区间右端点;否则设置区间左端点为mid + 1
流程:
int left_bound(std::vector<int> &nums, int target){
int begin = 0;
int end = noms.size() -1 ;
while(begin <= end){
int mid = (begin + end) / 2;
if(target == nums[mid]){
if(mid == 0 || target > nums[mid-1]){
return mid;
}
begin = mid + 1;
}
else if(target < nums[mid]){
end = mid -1;
}
else if(target > nums[mid]){
begin = mid +1;
}
}
return -1;
}
区间右端点
int right_bound(std::vector<int> &nums,int target){
int begin = 0;
int end = nums.size() -1;
while(begin <= end){
int mid =( begin + end )/2;
if(target == mid){
if(mid = nums.size()-1 || nums[mid+1] > target){
return mid;
}
begin = mid +1;
}
else if(target < nums[mid]){
end = mid -1;
}
else if(target > nums[mid]){
begin = mid+1;
}
}
return -1;
}
leetcode测试
class Solution{
public:
std::vector<int> searchRange(std::vector<int>&nums, int target){
std::vector<int> result;
result.push_back(left_bound(nums,target));
result.push_back(right_bound(nums,target));
return result;
}
};
int main(){
int test[] = {5,7,7,8,8,8,8,10};
std::vector<int> nums;
Solution solve;
for(int i = 0;i< 8;i++){
nums.push_back(test[i]);
}
for(int i= 0;i< 12;i++){
std::vector<int> result = solve.searchRange(nums,i);
printf("%d : [%d,%d]n",i, result[0],result[i]);
}
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- @陈同学的专属Python教程之函数
- 微信小程序的Web API接口设计及常见接口实现
- @陈同学的专属Python教程之常见数据结构
- 用易语言写个简单的小爬虫其中的关键点
- python坐标获取经纬度或经纬度获取坐标免费模块--geopy
- 详解:小程序页面预加载优化,让你的小程序运行如飞
- RocketMQ学习六-消息存储
- swoole 实现 unixSocket 通信
- mybatis-plus一对多关联查询踩坑
- 深入Spring Security魔幻山谷-获取认证机制核心原理讲解
- 文本相似性的总结
- Java面试题总结之JDBC 和Hibernate
- Mac 下搭建 Clion + OpenCV4.x 的开发环境
- 超详细,Windows系统搭建Flink官方练习环境
- MySQL 覆盖索引与延迟关联