LeetCode解题记录(34)——在排序数组中查找元素的第一个和最后一个位置

LeetCode解题记录——在排序数组中查找元素的第一个和最后一个位置

    • 题目描述
    • 示例
    • 题目理解
    • 解题思路

题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O ( l o g n ) O(log n) O(logn) 级别。

如果数组中不存在目标值,返回 [-1, -1]

示例

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

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

题目理解

题目要求了复杂度,对于log级别的复杂度,确定使用二分查找进行搜索。

问题的关键在于如何确定边缘。

解题思路

本题需要在二分查找的基础上,多一步边界的判断。由于需要两个边界的查找,因此在这里选择使用递归实现。

  • 边界条件有两个:begin>end和mid位置元素与目标值相同。

  • 在普通二分查找的基础上,需要对相等时加额外判断:

    1. 如果在左边界(越界或前一元素与目标值不等),则向结果数组中添加当前位置,否则调整头尾边界位置,进入递归。

    2. 如果在右边界(越界或后一元素与目标值不等),则向结果数组中添加当前位置,否则调整头尾边界位置,进入递归。

    3. 返回跳出递归。

对应代码如下:

class Solution {
public:
    vector searchRange(vector& nums, int target) {
        vector res;
        bisearch(res,nums,target,0,nums.size()-1);
        if(res.size() == 0){
            res.push_back(-1);
            res.push_back(-1);
        }
        return res;
    }
    void bisearch(vector& res,vector& nums,int target,int begin,int end){
        if(begin>end)
            return;
        int mid = (begin+end)/2;
        if(nums[mid] == target){
            if(mid-1<0||nums[mid-1]!=target){
                res.push_back(mid);
            }else{
                bisearch(res,nums,target,begin,mid-1);
            }
            if(mid+1>=nums.size()||nums[mid+1]!=target){
                res.push_back(mid);
            }else{
                bisearch(res,nums,target,mid+1,end);
            }
            return;
        }else if(nums[mid]>target){
            bisearch(res,nums,target,begin,mid-1);
        }else{
            bisearch(res,nums,target,mid+1,end);
        }
    }
};

运行结果如下:
LeetCode解题记录(34)——在排序数组中查找元素的第一个和最后一个位置_第1张图片

我的所有解题代码都会上传到我的github上,需要可以自取。

LeetCode解题代码

你可能感兴趣的:(LeetCode解题笔记)