题目:
给你一个按照非递减顺序排列的整数数组 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] <= 109
nums
是一个非递减数组-109 <= target <= 109
接下来我们一起来看看,
解题思路:利用二分查找法查找,先找最左变的目标元素,再找最右边的目标元素。二分查找法不熟悉的小伙伴可以去主页观看我往期的视频(二分查找法详解!!!)
步骤:
- 初始化两个指针,一个指向数组的开始(low),一个指向数组的结束(high)。
- 计算中间元素的索引 mid = (low + high) >>> 2(使用整数除法)。
- 检查中间元素是否是要查找的元素。如果是,返回 mid。
- 如果要查找的元素小于中间元素,更新 high = mid - 1, 并在数组的左半部分重复步骤 2 和 3。
- 如果要查找的元素大于中间元素,更新 low = mid + 1,并在数组的右半部分重复步骤 2 和 3。
- 如果 low > high,说明元素不在数组中,返回 -1 或其他表示未找到的值。
下面是LeetCode里面运行的代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
//调用left函数
int a = left(nums,target);
//调用left函数
int b = right(nums,target);
//定义一个数组,用于返回结果
int[] result = new int[2];
//将left 的结果添加到数组的第一个位置
result[0] = a;
//将right 的结果添加到数组的第二个位置
result[1] = b;
//返回结果
return result;
}
//定义方法,用于找到目标值的第一个位置
public int left(int[] nums,int target) {
//定义第一个指针,指向第一个元素
int i = 0;
//定义第二个指针,指向最后一个元素
int j = nums.length - 1;
//定义临时变量,用于返回找到结果(找到就替换-1,找不到就返回-1)
int temp = -1;
while (i <= j) {
定义中间指针
int mid = (i +j) / 2;
//目标值小于中间值
if (target < nums[mid]) {
//指向最后元素的指针移动到中间值的前一个元素
j = mid - 1;
}else if (target > nums[mid]) {
//指向第一个元素的指针移动到中间值的后一个元素
i = mid + 1;
}else {
//中间指针赋值给临时变量
temp = mid;
//指向最后元素的指针移动到中间值的前一个元素
j = mid - 1;
}
}
return temp;
}
//定义方法,用于找到目标值的最后一个位置
public int right(int[] nums,int target) {
//定义第一个指针,指向第一个元素
int i = 0;
//定义第二个指针,指向最后一个元素
int j = nums.length - 1;
//定义临时变量,用于返回找到结果(找到就替换-1,找不到就返回-1)
int temp = -1;
while (i <= j) {
//定义中间指针
int mid = (i +j) / 2;
if (target < nums[mid]) {
//指向最后元素的指针移动到中间值的前一个元素
j = mid - 1;
}else if (target > nums[mid]) {
//指向第一个元素的指针移动到中间值的后一个元素
i = mid + 1;
}else {
//中间指针赋值给临时变量
temp = mid;
//指向第一个元素的指针移动到中间值的后一个元素
i = mid + 1;
}
}
return temp;
}
}
好了,以上便是该方法的解决方法,没有问题的同学赶紧趁热打铁,去做做看吧,有问题的同学可以评论区留下问题,我会第一时间给大家解答的。
的看完了,留个关注吧,每天的会更新不一样的算法题哦!!!
标签:target,nums,int,元素,mid,34,数组,LeetCode From: https://blog.csdn.net/qq_54839572/article/details/139535700