描述
请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target
,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
示例1
输入:
[1,2,4,4,5],4
返回值:2
说明:
从左到右,查找到第1个为4的,下标为2,返回2
示例2
输入:
[1,2,4,4,5],3
返回值:-1
示例3
输入:
[1,1,1,1,1],1
返回值:0
解题:
题目中提及二分查找,且该数组有序,其中要求为第一个出现(意味着不能直接返回相等时下标),那么就要求我们必须取中间值到不能再取为止。
import java.util.*;
public class Solution {
public int search (int[] nums, int target) {
int n = nums.length;
if (n == 0) return -1;
int l = 0, r = n - 1; // 定义最左侧以及最右侧下标值
while (l < r) {
int mid = l + r >> 1; // 取中间值
if (nums[mid] >= target){ // 若中间值大于所查找值时,取左侧
r = mid;
}else{ //取右侧
l = mid + 1;
}
}
return nums[r] == target ? r : -1;
}
}