• [LeetCode] Search for a Range


    Given an array of integers 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].

    For example,
    Given [5, 7, 7, 8, 8, 10] and target value 8,
    return [3, 4].

    使用两次二分查找,第一次找出目标数的左边界,第二次找出目标数的右边界。最后判断边界并返回。

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            if (nums.empty())
                return {-1, -1};
            int lower = -1, upper = -1, mid = 0;
            
            int left = 0, right = nums.size() - 1;
            while (left <= right) {
                mid = (left + right) / 2;
                if (nums[mid] < target)
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            lower = left;
            
            left = 0, right = nums.size() - 1;
            while (left <= right) {
                mid = (left + right) / 2;
                if (nums[mid] > target) 
                    right = mid - 1;
                else
                    left = mid + 1;
            }
            upper = right;
            
            if (lower > upper)
                return {-1, -1};
            else 
                return {lower, upper};
        }
    };
    // 16 ms

    使用STL中的函数来完成这个算法

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            // judge nums'empty
            if (nums.empty())
                return {-1, -1};
            // find iterator that its value is equal or greater than target.
            auto left = lower_bound(nums.begin(), nums.end(), target);
            // find iterator that its value is greater than target.
            auto right = upper_bound(nums.begin(), nums.end(), target);
            
            // if target is not in nums.
            if ((left == right && *left != target) || (left == nums.end())) {
                return {-1, -1};
            }
            else {
                // find the iterator that its value is equal to target.
                right = prev(right);
                // distance is to calc the index in nums.
                return {distance(nums.begin(), left), distance(nums.begin(), right)};
            }
        }
    };
    // 9 ms
  • 相关阅读:
    第01组 团队Git现场编程实战
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第1组 团队展示
    第一次结对编程作业
    第一次博客作业
    2019 SDN上机第1次作业
    第08组 团队项目-需求分析报告
    团队项目-选题报告
  • 原文地址:https://www.cnblogs.com/immjc/p/7986213.html
Copyright © 2020-2023  润新知