水下功夫做透,水上才能顺风顺水。

给出一个有序数组,请在数组中找出目标值的起始位置和结束位置

给出一个有序数组,请在数组中找出目标值的起始位置和结束位置
你的算法的时间复杂度应该在O(log n)之内
如果数组中不存在目标,返回[-1, -1].

例如:
给出的数组是[50, 70, 70, 80, 80, 100],目标值是80,
返回[3, 4].


/**
** 两次二分查找
**/
public int[] searchRange (int[] A, int target) { int left = findIndex(A, target, true); int right = findIndex(A, target, false); return new int[]{left,right}; } int findIndex(int[] A, int target, boolean leftFlag){ int start = 0; int end = A.length-1; int index = -1; while(start<=end){ int mid =(start+end)/2; if(A[mid]>target){ end = mid-1; }else if(A[mid]<target){ start = mid +1; }else{ index = mid; if(leftFlag){ end = mid -1; }else{ start = mid+1; } } } return index; }

 

posted @ 2022-03-13 18:50  北方寒士  阅读(202)  评论(0编辑  收藏  举报