1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| public class FindFirstAndLastPositionOfElementInSortedArray {
public int[] searchRange(int[] nums, int target) {
int []ret = new int[]{-1,-1}; if(nums.length == 0 ){ return ret; } int len = nums.length; int pos = searchOnePos(nums,target,0,len-1); if(pos == -1){ return ret; } ret[0] = searchFirst(nums,target,pos,-1); ret[1] = searchFirst(nums,target,pos,1); return ret; }
private int searchFirst(int[] nums, int target,int pos, int step){
while(pos>=0 && pos<nums.length && nums[pos] == target){ pos = pos + step; } return pos-step; }
private int searchOnePos(int[] nums, int target,int left, int right){
if(left >= right){ if(nums[left] == target){ return left; } return -1; } if(left + 1 == right){ if(nums[left] == target){ return left; }else if(nums[right] == target){ return right; } return -1; }
int mid = (right-left)/2 + left; if(nums[mid] == target){ return mid; }
if (nums[mid] > target) { return searchOnePos(nums,target,left,mid-1); } else { return searchOnePos(nums,target,mid+1,right); } }
@Test public void test(){
int []nums = new int[] {0,1,2,3,4,5,5,6,7,7,8,8,9,9}; int target = 0; int [] expected = new int[]{0,0}; Assert.assertArrayEquals(expected,searchRange(nums,target)); }
}
|