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

吞佛童子2022年6月9日
  • algorithm
  • array
小于 1 分钟

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

难度: 🌕

问题描述

img_3.png


解法

class Solution {
    public int[] searchRange(int[] nums, int target) {
        // 思路:
        // 二分
        int len = nums.length;
        int[] res = new int[2];
        res[0] = mySol(nums, target, 0, len - 1, true);
        res[1] = mySol(nums, target, 0, len - 1, false);
        return res;
    }

    private int mySol(int[] nums, int target, int left, int right, boolean first) {
        // 递归终止条件
        if(left > right) {
            return -1;
        }
        if(left == right) {
            if(nums[left] == target) {
                return left;
            } else {
                return -1;
            }
        }
        int mid = left + ((right - left) >> 1);
        if(target > nums[mid]) {
            left = mid + 1;
            return mySol(nums, target, left, right, first);
        } else if(target < nums[mid]) {
            right = mid - 1;
            return mySol(nums, target, left, right, first);
        } else {
            // target == nums[mid]
            if(first) {
                // 找首次出现的位置 - 跟左边界值比较,看能否缩小左边界
                if(target > nums[left]) {
                    left ++;
                    return mySol(nums, target, left, right, first);
                } else {
                    // target == nums[left]
                    return left;
                }
            } else {
                // 找最后一次出现的位置
                if(target < nums[right]) {
                    right --;
                    return mySol(nums, target, left, right, first);
                } else {
                    return right;
                }
            }
        }
    }
}

输出

img_2.png

上次编辑于: 2022/6/20 下午8:24:47
贡献者: liuxianzhishou