每日一题——在排序数组中查找元素的第一个和最后一个位置

菜鸡每日一题系列打卡34

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(logn)级别。如果数组中不存在目标值,返回[-1, -1]。

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


示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

题目分析

这道题目是一道在有序数组中寻找目标值的题目,而且算法时间复杂度要求是O(logn)级别,这明显是在提示我们考虑二分的思想。和上一道题目类似,都是在二分搜索的基础上进行一些变形。本题的关键在于,如何使用二分找到起始目标值和最终目标值。其实只要动一动小心思,立马就能找到答案。且看代码。

代码实现

class Solution {
    
    public int[] searchRange(int[] nums, int target) {
        if (nums == null) return new int[]{-1, -1};
        int start = getIndex(nums, target - 1);
        if (start == nums.length || nums[start] != target) return new int[]{-1, -1};
        return new int[]{start, getIndex(nums, target) - 1};
    }


    private int getIndex(int[] nums, int target) {
        int start = 0, end = nums.length;
        while (start < end) {
            int mid = start + ((end - start) >> 1);
            if (nums[mid] > target) end = mid;
            else start = mid + 1;
        }
        return start;
    }


}

代码分析

对代码进行分析,对数组做了两次二分搜索,因此,时间复杂度为O(logn),而就空间而言,仅仅使用了常数级别的额外空间,因此,空间复杂度为O(1)。

执行结果

每日一题——在排序数组中查找元素的第一个和最后一个位置_第1张图片

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

你可能感兴趣的:(算法)