Skip to content

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;
}