leetcode 力扣 34 在排序数组中查找元素的第一个和最后一个位置

45 阅读1分钟

魔改二分法

首先明确我们的查找目标:直接找第一个target和最后一个target

直接看下面的注释即可

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        /*
         * nums如果是空的,下面while直接越界,
         * 因此不需健壮性判断
         */
        int first = -1;
        int second = -1;

        while (left <= right) {
            int mid = (left + right) / 2;

            /*
             * 找到了某一个target,但是我们需要找的是
             * 第一个target,先保存mid下来,再往左寻找。
             * 如果找到的是第一个target,while最终会越界,
             * 无需担心mid会丢失
             */
            if (nums[mid] == target) {
                first = mid;
                right = mid - 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        left = 0;
        right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;

            /*
             * 找到了某一个target,但是我们需要找的是
             * 最后一个target,先保存mid下来,再往右寻找。
             * 如果找到最后一个target,while最终会越界,
             * 无需担心mid会丢失
             */
            if (nums[mid] == target) {
                second = mid;
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return new int[] { first, second };
    }
}