题目
示例
方法1:二分法
思路作者:本人
这题 看到“非递减数组” 就想到要用二分法
只是在二分法的基础上,找到target之后 再往左走走看是不是还有target,再往右走走是不是还有target。
二分法虽然思路简单,但是写起来不简单,需要考虑到各种临界条件。
不知道基础的二分法的可以了解一下
基础的二分法
就是左指针在最左,右指针在最右,中间指针在 左右指针的中间。
如果 中间的值 == target ,那就是找到了
如果 中间的值 < target ,说明target 应该在 中间值的右边,所以 我们把左指针放到 中间指针的右边一个位置处,再次循环寻找。
如果 中间值 > target ,说明target 应该在 中间值的左边,所以 我们把右指针放到 中间指针的左边一个位置处,再次循环寻找。
循环结束条件是:左指针 大于 右指针 ,或者 左右指针超出数组的左右界限
lass Solution {
public int[] searchRange(int[] nums, int target) {
int arr[] = new int[2];
arr[0] = -1;
arr[1] = -1;
int left = 0;
int right = nums.length-1;
if (nums.length<=0)return arr;//排除长度小于1的情况
//如果 target 比第一个元素小,或者比最后一个元素大,那直接返回-1,-1
if (nums[left]>target && nums[right]<target){
return arr;
}
while (left <= right && left >=0 && right <=nums.length-1){
int mid = (left + right)/2;
if (nums[mid] == target){//如果找到了target
left = mid-1;
right = mid+1;
//再往mid的左右两边寻找target
while (left>=0 && nums[left] == target){
left--;
}
while (right<=nums.length-1 && nums[right] == target){
right++;
}
arr[0] = ++left;
arr[1] = --right;
return arr;
}else if (nums[mid] > target){
right = mid-1;
}else {
left = mid+1;
}
}
return arr;
}
}
效果
感觉这道题不算很难,会写二分法就行。