一:题目

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

输入:nums = [], target = 0
输出:[-1,-1]

二:思路

思路:1.我们求取给定数组范围内 目标值的左边界和右边界
2.拿下方的例子来解释:
nums = [5,7,7,8,8,10], target = 8
3.左边界指的就是数组当中的元素值都小于等于目标值的范围:5,7,7,8
右边界:指的是数组当中的元素值都大于等于目标值的范围:8,10
4.当我们求出目标值的左右边界,也就求出了题目说的开始和结束位置

三:上码

方法一:二分法

class Solution {public:vector<int> searchRange(vector<int>& v, int target) {//方法二:二分法/*思路:1.我们求取给定数组范围内 目标值的左边界和右边界2.拿下方的例子来解释:nums = [5,7,7,8,8,10], target = 83.左边界指的就是数组当中的元素值都小于等于目标值的范围:5,7,7,8右边界:指的是数组当中的元素值都大于等于目标值的范围:8,104.当我们求出目标值的左右边界,也就求出了题目说的开始和结束位置   */int l = left_border(v,target);int r = right_border(v,target);if(l == -3 || r == -3){//证明根本就无该目标值 比如[3,4,6] 找 7return {-1,-1};}if(v[l+1] == target && v[r-1] == target)//得保证查询到的元素存在return {l+1,r-1};//其他情况return{-1,-1};}//求取左边界(即数组当中均小于目标值的范围)int left_border(vector<int>& v, int target){int l = 0;int r = v.size() - 1;int mid;int temp = -3;while(l <= r){mid = (l+r)/2;if(v[mid] >= target){//这是结束的条件,因为已经出现要大于等于目标值的元素了r = mid - 1;temp = r;}else{l = mid + 1;//不断接近目标值,}}return temp;}//求取右边界(即数组当中的元素均大于目标值的范围)int right_border(vector<int>& v, int target){int l = 0;int r = v.size() - 1;int mid;int temp = -3;while(l <= r){mid = (l+r)/2;if(v[mid] > target){r = mid - 1;//不断缩小范围接近目标值,从数组的右边来}else{l = mid + 1;//证明查找到了出现小于等于目标值的元素时,这时循环也就结束了,因为 l > rtemp = l;}}    return temp;}};

方法二:调用库函数lower_bound,upper_bound

注意调用库函数的区别:

lower_bound(开始位置,结束位置,目标值) - 开始位置 : 这个返回的是元素第一次出现的位置(如果查询不到目标值则返回第一个比起大的元素下标)
upper_bound(开始位置,结束位置,目标值) - 开始位置 :这个返回的是有元素第一次大于目标值的位置,所以在本题中 要减一

注意这是升序数组当中调用的函数

我自己在测试用例时,用了个非升序的例子,害。。。。。。结果。。省略一万句。。。

class Solution {public:vector<int> searchRange(vector<int>& v, int target) {//  /**//  注意前提条件是输入的数值是升序的 // */ //方法一:利用库函数// //查询某个元素第一次出现的下标 int l = lower_bound(v.begin(),v.end(),target) - v.begin();if( l == v.size() || v[l] != target){   return {-1,-1};}//返回的是第一个大于待查数值的地址int r = upper_bound(v.begin(),v.end(),target) - v.begin(); return {l,r-1};}};

四:补充vector中lower_bound(),upper_bound()的用法测试用例

#include<bits/stdc++.h>
using namespace std;int main(){vector<int>v;int N,a;cin >> N >> a ;for(int i = 0; i < N; i++){int temp;cin >> temp;v.push_back(temp); } /**注意前提条件是输入的数值是升序的 */ //查询某个元素第一次出现的下标(如果查询不到目标值则返回第一个比起大的元素下标)int l = lower_bound(v.begin(),v.end(),a) - v.begin();//返回的是第一个大于待查数值的地址 int r = upper_bound(v.begin(),v.end(),a) - v.begin();cout << l << " " << r - 1;} //6 3
//1 2  3 4 4 5 //6 9
//5 7 7 8 8 10

拿走不用谢!!

最后在啰嗦啰嗦,最好不要用库函数,这道题,其实就是考察二分法的运用,对于这个库函数其实知道就行,可以将他用到你写的其他码上,本题不建议使用!!

好了 就这样!!加油 BOY!!! and girl!!!!!!!!!

34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !相关推荐

  1. leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返回 [-1, -1]. 进阶: 你可以设计并 ...

  2. LeetCode34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...

  3. [Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]

    [问题描述][中等] [解答思路] 1. 线性扫描(不符合题意) 时间复杂度:O(N) 空间复杂度:O(1) class Solution {public int[] searchRange(int[ ...

  4. LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置

    前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...

  5. 34. 在排序数组中查找元素的第一个和最后一个位置 golang

    34. 在排序数组中查找元素的第一个和最后一个位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-i ...

  6. 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  7. [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置

    LeetCode 专题 – 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置 难度:中等 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值 ...

  8. 34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置(两种方法记录) 法一(BP算法--使用双指针分别从前.后定位first index和last index),代码如下: class Solution ...

  9. 34. 在排序数组中查找元素的第一个和最后一个位置——二分法的魔鬼细节 小记

    每次遇到二分法,一看就会,一写就废,在力扣上看到一篇很好的总结,因此做一下搬运工 参考题解--二分法各种情况及细节剖析,附送小诗一首 场景包括寻找一个数.寻找左侧边界.寻找右侧边界. 而且,我们就是要 ...

最新文章

  1. mac远程连接windows工具_Windows远程MAC系统
  2. Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”
  3. php中用foreach改变数组的值的问题
  4. 深入FFM原理与实践
  5. Linux上快速搭建Jenkins服务器 实现持续集成开发
  6. 微信小程序开发——超链接或按钮点击跳转到其他页面失效
  7. 车联网服务non-RESTful架构改造实践
  8. 信息学奥赛一本通(1224:最大子矩阵)
  9. java并发初探ReentrantWriteReadLock
  10. Java多线程详解(基本概念)
  11. 系统无法执行指定的程序。_自制操作系统-函数代码副本跳转无法正确执行的问题...
  12. Spring Web MVC(二)
  13. C++算法之遗传算法及实现
  14. 2022年新冠疫情后上海的电子商务,数字化经济可能的新趋势
  15. 如何为NFT熊市做准备
  16. Dubbo实战入门,良心详解之作
  17. jmeter--上传图片类接口
  18. Icon glyphs 小图标命名收藏
  19. SLB 负载均衡实践
  20. swagger no content

热门文章

  1. onlyoffice 20并发限制处理
  2. java比c好逆向,吐槽一下java的效率。。。比起C差的真的好远。。。
  3. 用批处理修复 win10 无法升级的问题
  4. 【小程序】刘一哥课堂随机点名提问神器V1.0(附源程序)
  5. JavaScript读取本地图片到浏览器
  6. linux之安装frida遇到的问题
  7. Android之adb jdwp获取debug版本app的进程Id
  8. git之you can‘t overwrite the remote branch问题解决
  9. Android之Android Studio常用插件
  10. java3n 1_1005 继续(3n+1)猜想(JAVA)