https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
[why last() will not out of range]
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] notFound = new int[]{-1, -1};
if(nums.length==0){
return notFound;
}
int inx1 = first(nums, target);
if(inx1==-1){
return notFound;
}
int inx2 = last(nums, target);
return new int[]{inx1, inx2};
}
int first(int[] nums, int target){
int l = 0;
int r = nums.length-1;
while(l<r){
int m = l + (r-l)/2;
if(nums[m]<target){
l = m+1;
r = r;
}
else if(nums[m]>target){
l = l;
r = m -1;
}
else if(nums[m]==target){
l = l;
r = m;
}
}
if(l<0 || l>r){
return -1;
}
return nums[l]==target?l:-1;
}
int last(int[] nums, int target){
int l = 0;
int r = nums.length-1;
while(l<r){
int m = l + (r-l+1)/2;
if(nums[m]<target){
l = m+1;
r = r;
}
else if(nums[m]>target){
l = l;
r = m -1;
}
else if(nums[m]==target){
l = m;
r = r;
}
}
return nums[l]==target?l:-1;
}
}
[bug]
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] notFound = new int[]{-1, -1};
if(nums.length==0){
return notFound;
}
int inx1 = first(nums, target);
if(inx1==-1){
return notFound;
}
int inx2 = last(nums, target);
return new int[]{inx1, inx2};
}
int first(int[] nums, int target){
int l = 0;
int r = nums.length-1;
while(l<r){
int m = l + (r-l)/2;
if(nums[m]<target){
l = m+1;
r = r;
}
else if(nums[m]>target){
l = l;
r = m -1;
}
else if(nums[m]==target){
l = l;
r = m;
}
}
return nums[l]==target?l:-1;
}
int last(int[] nums, int target){
int l = 0;
int r = nums.length-1;
while(l<r){
int m = l + (r-l)/2;
if(nums[m]<target){
l = m+1;
r = r;
}
else if(nums[m]>target){
l = l;
r = m -1;
}
else if(nums[m]==target){
l = m;
r = r;
}
}
return nums[l]==target?l:-1;
}
}