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


    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; } };
     
  • 相关阅读:
    Python中的返回函数与闭包
    Python的高阶函数小结
    Python的生成器Generator小结
    Vim插件YCM的安装
    用Vundle管理Vim插件
    声卡(Sound Card)基本概念
    Linux中Source的用法
    js 的执行过程
    mongoose@4.5.2的eachAsync bug
    [mongodb] MMAP 和wiredTiger 的比较
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/11801396.html
Copyright © 2020-2023  润新知