码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-05 21:17:56      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:lin   algo   c++   run   amp   osi   position   end   range   

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]

我的解:

Runtime: 12 ms, faster than 32.21% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.2 MB, less than 98.90% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
    // 递归进行,二分查找
    void binSearch(vector<int>& nums, int target, int begin, int end, int& index1, int& index2)
    {
        while (begin <= end)
        {
            int mid = begin + (end - begin) / 2;
            if (nums[mid] == target)
            {
                if (mid < index1)index1 = mid;
                if (mid > index2)index2 = mid;
                if (begin == end) return ;
                if (mid > 0 && nums[mid - 1] == target) binSearch(nums, target, begin, mid - 1, index1, index2);
                if (mid < end && nums[mid + 1] == target) binSearch(nums, target, mid + 1, end, index1, index2);
                return;
            }
            if (nums[mid] < target)
            {
                begin = mid + 1;
            }
            if (nums[mid] > target)
            {
                end = mid - 1;
            }
        }
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res{ -1,-1 };
        if (nums.size() < 1)return res;
        int b = 0;
        int e = nums.size() - 1;
        int index1 = e + 1;
        int index2 = b - 1;
        binSearch(nums, target, b, e, index1, index2);
        if (index1 <= index2)
        {
            res[0] = index1;
            res[1] = index2;
        }
        return res;
    }
};

优秀解1:

Runtime: 8 ms, faster than 85.03% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.1 MB, less than 100.00% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
    int idx1 = lower_bound(nums, target);
    int idx2 = lower_bound(nums, target+1)-1;
    if (idx1 < nums.size() && nums[idx1] == target)
        return {idx1, idx2};
    else
        return {-1, -1};
}

// 利用二分查找的思想
int lower_bound(vector<int>& nums, int target) { int l = 0, r = nums.size()-1; while (l <= r) { int mid = (r-l)/2+l; if (nums[mid] < target) l = mid+1; else r = mid-1; } return l; } };

 

 

 

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

标签:lin   algo   c++   run   amp   osi   position   end   range   

原文地址:https://www.cnblogs.com/qiang-wei/p/11801396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!