题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-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]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
题目链接
分析:
先用二分找出目标值,在划分左右边界(滑动来慢慢确定位置(索引))
class Solution {
public int[] searchRange(int[] nums, int target) {
int index=searchTarget(nums,target);//返回的值赋给index,首先肯定返回的值就是数组内的
if(index==-1) return new int[] {-1, -1}; //返回若是-1,说明没有,则不存在,返回 [-1, -1]。
int leftBorder=index;//开始向左滑动
int rightBorder=index;//开始向右滑动
while(leftBorder-1>=0 && nums[leftBorder-1]==nums[index]){
/**首先你的值不能跑出索引0,所以要大于等于0才有意义滑动,然后看一下目标值是否有相邻情况即用nums[leftBorder-1]==nums[index]判断。不同就不符合直接返回就行。
**/
leftBorder--;
}
while(rightBorder+1<nums.length && nums[rightBorder+1]==nums[rightBorder]){//同理
rightBorder++;
}
return new int[]{leftBorder,rightBorder};
}
//先二分查找,找出目标值存否?找出后返回出,再进一步根据左右边界来确定位置(索引)
public int searchTarget(int [] nums,int target){
int left=0;
int right=nums.length-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]>target){
right=mid-1;
} else if(nums[mid]<target){
left=mid+1;
} else {
return mid;
}
}
return -1;
}
}