Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​LeetCode刷题实战34:在排序数组中查找元素的第一个和最后一个位置

​LeetCode刷题实战34:在排序数组中查找元素的第一个和最后一个位置

作者头像
程序员小猿
发布于 2021-01-20 02:30:20
发布于 2021-01-20 02:30:20
1.2K00
代码可运行
举报
文章被收录于专栏:程序IT圈程序IT圈
运行总次数:0
代码可运行

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做在排序数组中查找元素的第一个和最后一个位置,我们先来看题面:

https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array

Given an array of integers nums sorted in ascending order, 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].

题意

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

样例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

题解

思路1:手动二分法!

这里提供两种方法,一种容易理解,一种万能公式!

版本1:是指在二分法进行时,就判读是否有等于target的,但是找到的target不知道是最左边的数还是最右边的数,所以,通过找到这个数再找出相应的边界值.

版本2:是指二分法执行完毕,返回target在最左边的位置,在求出另一个边界!

关于详细说明,请看这篇[二分搜索](二分查找有几种写法?它们的区别是什么?- Jason Li的回答 - 知乎 https://www.zhihu.com/question/36132386/answer/530313852),读完之后,可以加深二分搜索的理解!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = {-1, -1};
        int n = nums.length;
        if (n == 0) return res;
        int left = 0;
        int right = n-1;
        while (left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                left = mid;
                right = mid;
                while (left > 0 && nums[left] == nums[left-1]) left--;
                while (right < n - 1 && nums[right] == nums[right+1]) right++;
                res[0] = left;
                res[1] = right;
                return res;
            }
            else if (nums[mid] > target) right = mid - 1;
            else left = mid + 1;
        }
        return res;
        
    }
}

思路2:库函数

python 的 bisect库

简要介绍一下,

bisect.bisect_left(a,x,lo=0,hi=len(a))a中找x最左边数的索引,如果找不到就返回插入的索引.

bisect.bisect(a, x, lo=0, hi=len(a)) 找最右边的!

思路3:

分而治之,参考链接:https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/discuss/14707/9-11-lines-O(log-n)

当然上面的时间复杂度都是:O(logn)

本文有点参考于

https://www.cnblogs.com/powercai/p/10826397.html

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode1-20题汇总,速度收藏!

LeetCode刷题实战21:合并两个有序链表

LeetCode刷题实战23:合并K个升序链表

LeetCode刷题实战24:两两交换链表中的节点

LeetCode刷题实战25:K 个一组翻转链表

LeetCode刷题实战26:删除排序数组中的重复项

LeetCode刷题实战27:移除元素

LeetCode刷题实战28:实现 strStr()

LeetCode刷题实战29:两数相除

LeetCode刷题实战30:串联所有单词的子串

LeetCode刷题实战31:下一个排列

LeetCode刷题实战32:最长有效括号

LeetCode刷题实战33:搜索旋转排序数组

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【leetcode刷题】T8-在排序数组中查找元素的第一个和最后一个位置
今天分享leetcode第8篇文章,也是leetcode第34题—Find First and Last Position of Element in Sorted Array(在排序数组中查找元素的第一个和最后一个位置),地址是:https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
木又AI帮
2019/07/17
5210
​LeetCode刷题实战33:搜索旋转排序数组
https://www.cnblogs.com/techflow/p/12441002.html
程序员小猿
2021/01/20
2240
​LeetCode刷题实战33:搜索旋转排序数组
​LeetCode刷题实战35: 搜索插入位置
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
2450
【力扣刷题】34. 在排序数组中查找元素的第一个和最后一个位置
来源:力扣(LeetCode) 整数数组 nums 按升序排列,数组中的值 互不相同 。
jayjay
2022/11/02
6300
【力扣刷题】34. 在排序数组中查找元素的第一个和最后一个位置
Leetcode34在排序数组中查找元素的第一个和最后一个位置(二分法求解)
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
伯约同学
2022/03/19
2470
【每日一题】34. Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
公众号-不为谁写的歌
2020/08/11
2710
leetcode刷题(89)——34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
老马的编程之旅
2022/06/22
6440
​LeetCode刷题实战540:有序数组中的单一元素
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/03/03
2440
【leetcode刷题】 20T19-在排序数组中查找元素的第一个和最后一个位置
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
木又AI帮
2020/02/25
3440
打卡群刷题总结0630——在排序数组中查找元素的第一个和最后一个位置
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
木又AI帮
2020/07/03
6940
打卡群刷题总结0630——在排序数组中查找元素的第一个和最后一个位置
​LeetCode刷题实战81:搜索旋转排序数组 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
4410
​LeetCode刷题实战81:搜索旋转排序数组 II
二分查找有序重复元素
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
MickyInvQ
2021/03/02
1.2K0
二分查找有序重复元素
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
Michael阿明
2020/07/13
1.8K0
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
LeetCode题目34:在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
二环宇少
2020/08/13
3.1K0
LeetCode题目34:在排序数组中查找元素的第一个和最后一个位置
【刷穿 LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置(中等)
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
宫水三叶的刷题日记
2021/02/20
1.7K0
LeetCode - #34 在排序数组中查找元素的第一个和最后一个位置(Top 100)
我们社区陆续会将顾毅(**Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤道长[1]**)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。
Swift社区
2022/04/04
1.5K0
LeetCode - #34 在排序数组中查找元素的第一个和最后一个位置(Top 100)
☆打卡算法☆LeetCode 34、在排序数组中查找元素的第一个和最后一个位置 算法解析
“给定一个升序排列的整数数组,和一个目标值,找出给定目标值在书中的开始位置和结束位置。”
恬静的小魔龙
2022/08/07
3500
☆打卡算法☆LeetCode 34、在排序数组中查找元素的第一个和最后一个位置  算法解析
LeetCode-算法-二分查找-第15天
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。
布衣者
2021/09/07
2500
二分问题-LeetCode 33、34(上下边界,二分查找)
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
算法工程师之路
2019/09/19
9660
【手绘漫画】图解LeetCode之搜索旋转排序数组(LeetCode33题),二分查找
排序,旋转,不重复,没错,就是我,【手绘漫画】图解LeetCode之寻找旋转排序数组中的最小值(LeetCode153题)大声喊到。
我是管小亮
2020/04/20
4080
推荐阅读
【leetcode刷题】T8-在排序数组中查找元素的第一个和最后一个位置
5210
​LeetCode刷题实战33:搜索旋转排序数组
2240
​LeetCode刷题实战35: 搜索插入位置
2450
【力扣刷题】34. 在排序数组中查找元素的第一个和最后一个位置
6300
Leetcode34在排序数组中查找元素的第一个和最后一个位置(二分法求解)
2470
【每日一题】34. Find First and Last Position of Element in Sorted Array
2710
leetcode刷题(89)——34. 在排序数组中查找元素的第一个和最后一个位置
6440
​LeetCode刷题实战540:有序数组中的单一元素
2440
【leetcode刷题】 20T19-在排序数组中查找元素的第一个和最后一个位置
3440
打卡群刷题总结0630——在排序数组中查找元素的第一个和最后一个位置
6940
​LeetCode刷题实战81:搜索旋转排序数组 II
4410
二分查找有序重复元素
1.2K0
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
1.8K0
LeetCode题目34:在排序数组中查找元素的第一个和最后一个位置
3.1K0
【刷穿 LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置(中等)
1.7K0
LeetCode - #34 在排序数组中查找元素的第一个和最后一个位置(Top 100)
1.5K0
☆打卡算法☆LeetCode 34、在排序数组中查找元素的第一个和最后一个位置 算法解析
3500
LeetCode-算法-二分查找-第15天
2500
二分问题-LeetCode 33、34(上下边界,二分查找)
9660
【手绘漫画】图解LeetCode之搜索旋转排序数组(LeetCode33题),二分查找
4080
相关推荐
【leetcode刷题】T8-在排序数组中查找元素的第一个和最后一个位置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验