230 字 1 分钟阅读

  • 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

    示例 1:

    输入: nums = [-1,0,3,5,9,12], target = 9
    输出: 4
    解释: 9 出现在 nums 中并且下标为 4
    

    示例 2:

    输入: nums = [-1,0,3,5,9,12], target = 2
    输出: -1
    解释: 2 不存在 nums 中因此返回 -1
    

    提示:

    1. 你可以假设 nums 中的所有元素是不重复的。
    2. n 将在 [1, 10000]之间。
    3. nums 的每个元素都将在 [-9999, 9999]之间。

思路

简单的二分搜索,注意边界值处理,递归尝试优化为迭代。

递归版:

public int search(int[] nums, int target) {
    return binarySearch(nums, 0, nums.length - 1, target);
}

public int binarySearch(int[] nums, int start, int end, int target) {
    if (start > end || start < 0 || end > nums.length - 1) {
        return -1;
    }
    // 很容易忘记加上start
    int mid = (end - start) / 2 + start;
    if (nums[mid] == target) {
        return mid;
    }
    if (nums[mid] > target) {
        return binarySearch(nums, start, mid - 1, target);
    }
    if (nums[mid] < target) {
        return binarySearch(nums, mid + 1, end, target);
    }
    return -1;
}

迭代版:

public int search(int[] nums, int target) {

    if(nums == null || nums.length == 0 || target < nums[0] || target > nums[nums.length - 1]){
        return -1;
    }

    int left = 0;
    int right = nums.length - 1;

    while (left <= right){
        
        int mid = (right - left) / 2 + left;
        
        if(nums[mid] < target){
            left = mid + 1;           
        }else if(nums[mid] > target){
            right = mid - 1;
        }else{
            return mid;
        }
    }

    return -1;
}