🌕 剑指 Offer 53 - I. 在排序数组中查找数字 I

吞佛童子2022年10月10日
  • algorithm
  • 二分
小于 1 分钟

🌕 剑指 Offer 53 - I. 在排序数组中查找数字 I

难度: 🌕

问题描述

img_19.png


解法

class Solution {
    public int search(int[] nums, int target) {
        // 思路:
        // 2 次二分,分别找首次出现下标 & 末尾出现下标
        int len = nums.length;
        if(len == 0) {
            return 0;
        }
        int left = mySol(nums, target, 0, len - 1, true);
        if(left < 0) {
            return 0;
        }
        int right = mySol(nums, target, 0, len - 1, false);
        return right - left + 1;
    }

    private int mySol(int[] nums, int target, int left, int right, boolean first) {
        // 递归终止条件
        if(left >= right) {
            if(nums[left] == target) {
                return left;
            } else {
                return -1;
            }
        }
        // left < right
        int mid = left + ((right - left) >> 1);
        if(target > nums[mid]) {
            return mySol(nums, target, mid + 1, right, first);
        } else if(target < nums[mid]) {
            return mySol(nums, target, left, mid - 1, first);
        } else {
            // target == [mid]
            if(first) {
                // 找首个出现下标
                return mySol(nums, target, left, mid, first);
            } else {
                if(nums[mid + 1] != target) {
                    return mid;
                } else {
                    return mySol(nums, target, mid + 1, right, first);
                }
            }
        }
    }
}

输出

img_20.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou