Skip to content

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

@Animenzzzz

Description

@Animenzzzz

题目描述:

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

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

如果数组中不存在目标值,返回 [-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]

解题思路:使用二分法,每次从中间开始比较mid值和target值,mid值更大,说明在左边更小的区间(更新end),否则在右边的区间(更新begin)。最后找到mid值之后,从mid中间往左右两边扩散找相同的值

C++解题:

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions