天天看點

leetcode [34. 在排序數組中查找元素的第一個和最後一個位置leetcode 34. 在排序數組中查找元素的第一個和最後一個位置

@(labuladong的算法小抄)[二分]

leetcode 34. 在排序數組中查找元素的第一個和最後一個位置

題目描述

leetcode [34. 在排序數組中查找元素的第一個和最後一個位置leetcode 34. 在排序數組中查找元素的第一個和最後一個位置

解題思路

參考:labuladong的算法小抄 P75

class Solution {
    public int[] searchRange(int[] nums, int target) {
        if (nums.length == 0) return new int[]{-1, -1};
        /* 找到目标值的起始位置 */
        int startOfTarget = findStartOfTarget(nums, target);
        /* 如果不存在target,直接傳回 */
        if (startOfTarget == -1) return new int[]{-1, -1};
        /* 找到目标值的結束位置 */
        int endOfTarget = findEndOfTarget(nums, target);

        return new int[]{startOfTarget, endOfTarget};
    }

    /* 尋找左側邊界,傳回左側邊界的起始位置 */
    private int findStartOfTarget(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        /* 搜尋區間為[left, right] */
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                /* 收縮右邊界 */
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            }
        }
        /* 如果找到目标值,left正好指在target處,是以要檢查left出界情況 */
        if (left >= nums.length || nums[left] != target) return -1;
       
        return left;
    }

    /* 尋找右側邊界,傳回右側邊界的結束位置 */
    private int findEndOfTarget(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        /* 搜尋區間為[left, right] */
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                /* 收縮左邊界 */
                left = mid + 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            }
        }
        /* 如果找到目标值,right正好指在target處,是以要檢查right的出界情況 */
        if (right < 0 || nums[right] != target) return -1;
        
        return right;
    }
}
           

繼續閱讀