zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    摘:SQL Server数据类型的25种
    二维码简介和容错率的问题
    PHP QR Code
    Git 更新操作
    [转载]ecmall语言包程序
    linux 从百度网盘下载文件的方法
    Linux定时备份数据到百度云盘
    nginx整合php+lua+oracle环境搭建
    php 36进制与10进制转换
    “互联网+”取代O2O将成为2016最大风口
  • 原文地址:https://www.cnblogs.com/immjc/p/7986213.html
Copyright © 2011-2022 走看看