描述
给定一个长度为n的非降序排列的整数数组numsnums,和一个目标值 targettarget。请找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 targettarget,返回 [-1, -1]
该题有O(logn)O(logn)的解法
0≤nums.length≤1∗10 ^5
−1∗10 ^9 ≤nums[i]≤1∗10 ^9
−1∗10 ^9 ≤target≤1∗10 ^9
示例1
输入:[4,7,7,8,8,10],8
返回值:[3,4]
说明:
可以在数组中找到整数8,其开始位置为3,结束位置为4
示例2
输入:[4,7,7,8,8,10],6
返回值:[-1,-1]
说明:
不可以在数组中找到整数6,故输出整数-1
牛客网
双指针法,找到即不移动指针,到两者都找到时,再存入,否则视为没找到。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型ArrayList
* @param target int整型
* @return int整型ArrayList
*/
public ArrayList<Integer> searchRange (ArrayList<Integer> nums, int target) {
// write code here
int l=0,r=nums.size()-1;
int left = l ,right = r;
ArrayList<Integer> result = new ArrayList<>();
while(l<=r){
if(nums.get(l) == target && nums.get(r) == target){
result.add(l);
result.add(r);
return result;
}
if(nums.get(l)!=target){
l++;
}
if(nums.get(r)!=target){
r--;
}
}
result.add(-1);result.add(-1);
return result;
}
}
二分法:
import java.util.*;
public class Solution {
public ArrayList<Integer> searchRange (ArrayList<Integer> nums, int target) {
ArrayList<Integer> res = new ArrayList<>();
res.add(left_bound(nums,target));
res.add(right_bound(nums,target));
return res;
}
private int left_bound(ArrayList<Integer> nums, int target){
int left = 0,right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums.get(mid) == target){
right = mid-1;
}else if(nums.get(mid) < target){
left = mid+1;
}else if(nums.get(mid) > target){
right = mid-1;
}
}
if(left == nums.size()){
return -1;
}
return nums.get(left) == target?left:-1;
}
private int right_bound(ArrayList<Integer> nums,int target){
int left = 0,right = nums.size()-1;
while(left <= right){
int mid = left+(right-left)/2;
if(nums.get(mid) == target){
left = mid+1;
}else if(nums.get(mid) < target){
left = mid+1;
}else if(nums.get(mid) > target){
right = mid-1;
}
}
if(left-1<0){
return -1;
}
return nums.get(left-1) == target ? left-1:-1;
}
}