题目地址(34. 在排序数组中查找元素的第一个和最后一个位置)
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
题目描述
给定一个按照升序排列的整数数组 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]提示:0 <= nums.length <= 105-109 <= nums[i] <= 109nums 是一个非递减数组-109 <= target <= 109
前置知识
- 二分查找
公司
- 暂无
思路
先把取得边界的情况分为三种
- t在边界的左边或者右边
- t在边界中间 但是并没有在数组中
- t在数组中
针对这3种情况 需要求出数组的左边界和右边界 因为我比较菜 所以将左右边界分开求
关键点
代码
- 语言支持:Java
Java Code:
class Solution {public int[] searchRange(int[] nums, int target) {int leftBorder = getLeftBorder(nums,target);//调用方法 返回左右边界的值int rightBorder = getRightBorder(nums,target);//情况一 左右边界的值都是初始化的值 并没有在区间内 如果有其中一个数字大于边界 那么他的其中一个边界值将未定义if(leftBorder==-2||rightBorder==-2){return new int[]{-1,-1};}//情况三 左右边界中有值if(rightBorder - leftBorder >1){return new int[]{leftBorder+1,rightBorder-1};}//情况二 在区间内 但是并无值return new int[]{-1,-1};}public int getRightBorder(int[] nums , int target){int begin = 0, end = nums.length - 1, rightBorder = -2; //初始化未标记的值while (begin <= end) {int mid = (begin + end) / 2;if (nums[mid] > target) {end = mid - 1;// target 在左区间,所以[left, middle - 1]} else {// 当nums[middle] == target的时候,更新left,这样才能得到target的右边界begin = mid + 1;rightBorder = begin;}}return rightBorder;}public int getLeftBorder(int[] nums , int target){int begin = 0, end = nums.length - 1, leftBorder = -2;while (begin <= end) {int mid = (begin + end) / 2;if (nums[mid] >= target) {// 寻找左边界,就要在nums[middle] == target的时候更新rightend = mid - 1;leftBorder = end;} else {begin = mid + 1;}}return leftBorder;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28logn%29&id=SbDil)
- 空间复杂度:
#card=math&code=O%28n%29&id=zS0vO)
