给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
来源:力扣(LeetCode)
上代码:
public static void main(String[] ar) {
int[] nums = {1};
int[] result = searchRange1(nums, 1);
}
/**
* 二分法
* @param nums
* @param target
* @param fristOne 是否第一个命中
* @return
*/
public static int searchRangeLeft(int[] nums, int target, boolean fristOne) {
int arrLen = nums.length;
int left = 0;
int right = arrLen;
while (left < right) {
int middle = (left + right) / 2;
int middleNum = nums[middle];
if (target == middleNum) {
if (fristOne) {
//命中第一个 退出循环
right = middle;
} else {
//往右边找 是否还有其他相同的 要最后一个
left = middle + 1;
}
} else if (target > middleNum) {
left = middle + 1;
} else {
right = middle;
}
}
return left;
}
public static int[] searchRange1(int[] nums, int target) {
int[] result = {-1,-1};
int left = searchRangeLeft(nums, target, true);
if (nums.length > left && nums[left] == target) {
//查找右边最后一个
int right = searchRangeLeft(nums, target, false)-1;
if (nums[left] == target) {
result = new int[]{left, right};
} else {
result = new int[]{left, left};
}
}
return result;
}