# 0034. Find First and Last Position of Element in Sorted Array
###### tags: `Leetcode` `Medium` `Binary Search`
Binary Search的方法适合于已经有排过序的array,复杂度$O(logN)$
## 思路
这道题和普通的binary search不同的是,普通binary search只要找到这个数就好,但这题要找到最左边的这个数和最右边的这个数所在的位置。
注意binary search为了防止溢位定义mid的时候都是用```mid = start+(end-start)/2```
如果初始```end = nums.length-1```,那么在搜寻右边位置的时候,如果右边位置恰好在nums的结尾,但是由于end最大到nums.length-1,```end-=1```之后end就等于```nums.length-2```了,于是就错了
## Code
```java=
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length==0) return new int[]{-1,-1};
int start = 0;
int end = nums.length;
int left, right;
while(start<end){
int mid = start+(end-start)/2;
if(nums[mid]<target){
start = mid+1;
}
else{
end = mid;
}
}
if(start==nums.length || nums[start]!=target){
return new int[]{-1,-1};
}
left = start;
start = 0;
end = nums.length;
while(start<end){
int mid = start+(end-start)/2;
if(nums[mid]<=target){
start = mid+1;
}
else{
end = mid;
}
}
right = start-1;
return new int[]{left, right};
}
}
```
笨笨写的
```java=
class Solution {
public int[] searchRange(int[] nums, int target) {
int len = nums.length;
if (len == 0) return new int[] {-1,-1};
int left = findLeft(nums, target);
if (left == -1) return new int[] {-1,-1};
int right = findRight(nums, target);
return new int[] {left, right};
}
private int findRight(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right){
int mid = (left + right + 1) / 2;
if (nums[mid] > target){
right = mid - 1;
}else if (nums[mid] == target){
left = mid;
}else {
left = mid + 1;
}
}
return left;
}
private int findLeft(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right){
int mid = (left + right) / 2;
if (nums[mid] < target){
left = mid + 1;
}else if (nums[mid] == target){
right = mid;
}else {
right = mid - 1;
}
}
if (nums[left] == target) return left;
return -1;
}
```