作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人

前文回顾:

leetcode1. 两数之和--每天刷一道leetcode系列!

leetcode2. 两数相加--每天刷一道leetcode系列!

leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!

leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!

leetcode5.最长回文子串--每天刷一道leetcode系列!

leetcode9. 回文数--每天刷一道leetcode系列!

leetcode11. 盛最多水的容器--每天刷一道leetcode系列!

leetcode14. 最长公共前缀--每天刷一道leetcode算法题系列!

leetcode15. 三数之和--每天刷一道leetcode算法系列!

leetcode16. 最接近的三数之和--每天刷一道leetcode算法系列!

leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

leetcode18. 四数之和--每天刷一道leetcode算法系列!

leetcode19. 删除链表的倒数第N个节点--每天刷一道leetcode算法系列!

leetcode20. 括号生成--每天刷一道leetcode算法系列!

leetcode21. 合并两个有序链表--每天刷一道leetcode算法系列!

leetcode22. 括号生成--每天刷一道leetcode算法系列!

leetcode23. 合并K个排序链表--每天刷一道leetcode算法系列!

leetcode24. 两两交换链表中的节点--每天刷一道leetcode算法系列!

leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!

leetcode26. 删除排序数组中的重复项--每天刷一道leetcode算法系列!

leetcode27. 移除元素--每天刷一道leetcode算法系列!

leetcode32. 最长有效括号--每天刷一道leetcode算法系列!

leetcode33. 搜索旋转排序数组--每天刷一道leetcode算法系列!

leetcode 34. 在排序数组中查找元素的第一个和最后一个位置--每天刷一道leetcode算法系列!(本篇)

题目描述

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

分析

本题是一个典型的二分查找类题目。题目的意思很明确,就是寻找左边界和右边界。
二分查找看似很简单,其实里面的变化还是蛮多的。
如何寻找左边界呢?
1.1如果nums[mid] < target,那么左边没有target。start = mid+1,

1.2如果nums[mid]==target,在正常的二分查找中,这种情况是可以直接返回结果。但是因为我们是要查找左边界,这就有可能mid的左边还有可能有target这个数。因此需要进行两步操作。

1.2.1 用一个变量res标记mid的值,如果左边还有数值等于target,则更新res的值。否则直接返回res即可。

1.2.2 end = mid - 1,继续向左查找。

1.3 如果nums[mid] > target, 同1.2.2 end = mid - 1,继续向左查找。

如何寻找右边界呢?
2.1如果nums[mid] > target,那么右边没有target。end = mid - 1,
2.2如果nums[mid]==target,在正常的二分查找中,这种情况是可以直接返回结果。但是因为我们是要查找右边界,这就有可能mid的右边还有可能有target这个数。因此需要进行两步操作。
  2.2.1 用一个变量res标记mid的值,如果左边还有数值等于target,则更新res的值。否则直接返回res即可。
  2.2.2 start = mid + 1,继续向右查找。
2.3 如果nums[mid] < target, 同1.2.2 start = mid + 1,继续向右查找。
其实说白了,找target,找target的左边界或者找target的右边界仅仅是在nums[mid]==target的处理上有差别。

代码

public int[] searchRange(int[] nums, int target) {        assert nums!= null;        if(nums.length == 0){            return new int[]{-1,-1};        }        int[] res = new int[]{findLeft(nums, target),findRight(nums, target)};        return res;    }

    private int findLeft(int[] nums, int target){        int len = nums.length;        int res = -1;        int start = 0;        int end = len - 1;        while (start <= end){            int mid = start + (end - start)/2;            if(nums[mid]                 start = mid + 1;            }             else {                if(nums[mid] == target){                    res = mid;                }                end = mid - 1;            }        }

        return res;

    }

    private int findRight(int[] nums, int target){        int len = nums.length;        int res = -1;        int start = 0;        int end = len - 1;        while (start <= end){            int mid = start + (end - start)/2;            if(nums[mid] > target){                end = mid - 1;            }            else {                if(nums[mid] == target){                    res = mid;                }                start = mid + 1;

            }        }

        return res;

    }

长按订阅更多面经分享

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

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

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

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

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

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

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

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

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

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

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

  6. 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标

    34. 在排序数组中查找元素的第一个和最后一个位置 难度中等2012 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target.请你找出给定目标值在数组中的开始位置和结束位置. 如果 ...

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

    在排序数组中查找元素的第一个和最后一个位置 class Solution {public int[] searchRange(int[] nums, int target) {int len = nu ...

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

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返 ...

  9. 算法----- 在排序数组中查找元素的第一个和最后一个位置

    题目: 在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log ...

最新文章

  1. 推荐一个Android开源项目-AisenWeiBo
  2. vb.net限制datagridview不能选择_家里安装200兆宽带,网速还是很慢怎么办?教你一招解除网速限制...
  3. 固定在左右两侧不动的广告条 样式
  4. 设置TextView为下划线的样式
  5. 前端学习(2030)vue之电商管理系统电商系统之提交代码
  6. 长时间使用s档有危害吗_空调长时间不清洗竟有这么多危害 你知道吗?
  7. 从网络上下载文件到本地
  8. 嵌入式linux快速入门
  9. matlab 转移矩阵,matlab转移矩阵
  10. [Asp.Net WebApi]WebApi入门
  11. 关于openlaeyrs获取谷歌卫星地图的无偏瓦片
  12. 【Alpha】第四次Daily Scrum Meeting
  13. GitHub的镜像登陆显示Whoa there!解决办法
  14. 笔记本手机都能用的充电器,做的只有乒乓球大小,AOHi 65W氮化镓充电器体验
  15. 用PyMOL展示配体和受体相互作用的原子和氢键
  16. I have the Dream
  17. pytorch之torch.zeros_like,torch.ones_like和tensor按索引赋值
  18. c语言 输入学生的姓名或学号 查询成绩,1、学生信息的录入。如:学生编号、学生姓名、学生成绩。 2、学生信息的查询及显示。如:按学号查询、按成...
  19. getInputStream() has already been called for this request解决方法二
  20. Conditional, Ternary 运算符的使用

热门文章

  1. 左手代码右手滑板 支付宝这个程序员有些酷
  2. 通过SQL即可让监控分析更简单更高效
  3. 端上智能——深度学习模型压缩与加速
  4. 冬奥开幕在即,现场通信网络技术深度揭秘!
  5. 赠书 | SkyWalking 观测 Service Mesh 技术大公开
  6. Kubernetes 是如何调度的?
  7. Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!
  8. 文末送书啦!| Device Mapper,那些你不知道的Docker核心技术
  9. 牛顿迭代法c 语言程序,牛顿迭代法 c语言实现
  10. linux无法关机 grub2,Ubuntu关机卡住无法关机如何解决?