-
Notifications
You must be signed in to change notification settings - Fork 1
Target 第一次出现的位置
小梁同学 edited this page Oct 28, 2019
·
1 revision
描述
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
输入:[1,4,4,5,7,7,8,9,9,10]
输出: 0
样例解释:
第一次出现在第0个位置。
输入: [1, 2, 3, 3, 4, 5, 10],3*
输出: 2
样例解释:
第一次出现在第2个位置
输入: [1, 2, 3, 3, 4, 5, 10],6
输出: -1
样例解释:
没有出现过6, 返回-1
查找第一次出现的位置,问题就是在判断到 num[middle] == target 的时候,left 或者 right 应该怎么移动,有了查找最后一个位置的思路后,那么要找第一次出现的位置就是在 num[middle] == targets时,我们还需要继续向左看看 middle 左边还有没有相同的值
public int findFirstPositionOfTarget(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int middle = left + (right - left) / 2;
if (nums[middle] == target) {
right = middle - 1; // 1.
if (right < 0 || nums[right] < target) { // 2.
return middle;
}
} else if (nums[middle] < target) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return -1;
}