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

leetcode题目链接: 34.在排序数组中查找元素的第一个和最后一个位置

题目描述:

34.在排序数组中查找元素的第一个和最后一个位置_第1张图片
34.在排序数组中查找元素的第一个和最后一个位置_第2张图片

解法:二分法
三种常用的二分法模板分析

因为数组元素是有序的,利用二分查找可以做到Olog(n)的时间复杂度。

  1. 查找 >= target (开始位置)
  2. 查找 target + 1(结束位置)

代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        
        int right = nums.length ;
        int first = find(nums, 0, right, target);//开始位置
        int second = find(nums, 0, right, target + 1);//结束位置
        //没有找到 target
        if(first == nums.length || nums[first] != target){
            return new int[]{-1,-1};
        }
        return new int[]{first, second - 1};
 
    }
	//二分查找模板二
    int find(int[] nums, int left, int right, int target){
        while(left < right){
            int mid = (left + right) >> 1;
            if(nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
}

你可能感兴趣的:(leetcode做题笔记,java,算法,leetcode,数据结构)