数组-8-LeetCode 34题 -> 在排序数组中查找元素第一个位置和最后一个位置

LeetCode 34题 -> 在排序数组中查找元素第一个位置和最后一个位置

1. 题目描述
  • 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。

  • 示例 :

    输入:nums = [5,7,7,8,8,10], target = 8
    输出:[3,4]

2. 解题思路
  • 二分法查找

    • 找第一个等于target的数的位置,即左边界;
    • 找第一个大于target的数的位置-1,即右边界;

    如图为找左边界的思路,找右边界同理!

数组-8-LeetCode 34题 -> 在排序数组中查找元素第一个位置和最后一个位置_第1张图片

3. 代码实现
import java.util.Arrays;
public class SearchRange {
     
    public static int[] searchRange(int[] nums, int target){
     
        int firstPosition = findFirstPosition(nums,target);
        int lastPosition = findLastPosition(nums,target);
        return new int[]{
     firstPosition,lastPosition};
    }
	//找左边界
    public static int findFirstPosition(int[] nums, int target){
     
        if(nums == null || nums.length < 0){
     
            return -1;
        }
        int left = 0;
        int right = nums.length-1;
        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{
     
                right = mid - 1;
            }
        }
        if(left >= nums.length || nums[left] != target){
     
            return -1;
        }
        return left;
    }
	//找右边界
    public static int findLastPosition(int[] nums, int target){
     
        if(nums == null || nums.length < 0){
     
            return -1;
        }
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
     
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
     
                left = mid + 1;
            }else if(nums[mid] > target){
     
                right = mid - 1;
            }else{
     
                left = mid + 1;
            }
        }
        if(right <= -1 || nums[right] != target){
     
            return -1;
        }
        return right;
    }
	//测试
    public static void main(String[] args) {
     
        int[] nums = {
     5, 7, 7, 8, 8, 10};
        int target = 8;
        System.out.println(Arrays.toString(searchRange(nums, target)));
    }
}

你可能感兴趣的:(LeetCode,二分法,leetcode,数据结构)