34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.If target is not found in the array, return [-1, -1].
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
class Solution {
public int[] searchRange(int[] nums, int target) {
int length = nums.length;
int[] res = new int[]{-1,-1};
int left =0;
int right =length-1;
//特殊情况判定
if(length==0||nums[left]>target||nums[right]<target){
return res;
}
while(left<=right){
if(nums[left]==target&&nums[right]==target){
break;
}
int mid = left+(right-left)/2;
if(nums[mid]==target&&nums[left]!=target){
left++;
continue;
}
if(nums[mid]==target&&nums[right]!=target){
right--;
continue;
}
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}
}
if(nums[left]==target&&nums[right]==target){
res[0]=left;
res[1]=right;
}
return res;
}
}
点评:本题以二分查找为框架进行算法运算,通过双指针左右两边边界从而获得最后答案。
如何解题:首先根据题目提供的非递减条件判断使用二分查找方法,定义左右边界可看作一个大框,然后先排除特殊情况,在循环内判断是否满足左右边界条件即左右边界以满足条件,不满足时的三种情况进行进一步的缩小边框,跳出循环后需要对数组进行判断是否寻找到正确结果。