Leetcode刷题107-34. 在排序数组中查找元素的第一个和最后一个位置(C++详细解法!!!)

Come from : [https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/]

34. Find First and Last Position of Element in Sorted Array

1.Question

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1 :

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2 :

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

2.Answer

medium 类型题目。。

我的方法1:(二分查找法—两个函数实现左右边界)
AC代码如下:

//实现区间左端点
int left_bound(vector<int>& nums, int target)
{
        int begin = 0;
        int end = nums.size() - 1;
        while(begin <= end)
        {
            int mid = (begin + end)/2;
            if(nums[mid] == target)
            {
                if(mid == 0 || nums[mid-1] < target)
                {
                    return mid;
                }
                end = mid - 1;
            }
            else if(nums[mid] < target)
            {
                begin = mid + 1;
            }
            else if(nums[mid] > target)
            {
                end = mid - 1;
            }
        }
    return -1;
}

 //实现区间右端点       
int right_bound(vector<int>& nums, int target)
{
        int begin = 0;
        int end = nums.size() - 1;
        while(begin <= end)
        {
            int mid = (begin + end)/2;
            if(nums[mid] == target)
            {
                if(mid == nums.size() - 1 || nums[mid+1] > target)
                {
                    return mid;
                }
                begin = mid + 1;
            }
            else if(nums[mid] < target)
            {
                begin = mid + 1;
            }
            else if(nums[mid] > target)
            {
                end = mid - 1;
            }
        }
    return -1;
}

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res;
        res.push_back(left_bound(nums, target));
        res.push_back(right_bound(nums, target));
        return res;
    }
};

我的方法2:(二分查找法)
AC代码如下:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        vector<int> res = {-1,-1};
        bool find = false;
        while(right >= left && find == false && nums[left] <= target )
        {
            int mid = (left+right)/2;
            if(nums[mid] > target)
                right = mid-1;
            else if(nums[mid] < target)
                left = mid+1;
            else
            {
                find = true;
                while(mid > 0 && nums[mid-1] == target)     //向前找起始点
                    mid--;
                res[0] = mid;
                while(mid < nums.size()-1 && nums[mid+1] == target)   //向后找终止点
                    mid++;
                res[1]=mid;
            }
        }
        return res;
    }
};

3.大神解答

速度排名第一(0秒 过分了啊)。

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

4.我的收获

二分查找。
fighting。。。

2019/6/25 胡云层 于南京 107

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/93652511
今日推荐