• 34. Search for a Range


    Given a sorted array of integers, 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].


    二分查找的变形:

    1、没有找到返回[-1, -1]

    2、只存在1个返回[pos, pos]

    3、存在多个,返回端点[leftPos, rightPos]

    #include <iostream>
    #include <set>
    #include <map>
    #include <vector>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <bitset>
    using namespace std;
    
    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            vector<int>vec;
            int leftPos = BinarySearchLeft(nums, target);
            int rightPos = BinarySearchRight(nums, target);
            if (nums[leftPos] != target)
            {
                vec.push_back(-1);
                vec.push_back(-1);
            }
            else
            {
                vec.push_back(leftPos);
                vec.push_back(rightPos);
            }
            return vec;
        }
    private:
    	int BinarySearchLeft(vector<int>& nums, int target)
        {
            int left = 0;
            int right = nums.size() - 1;
            while(left <= right)
            {
                int mid = left + ((right - left) >> 1);
              
                if (nums[mid] >= target)
                {
                    right = mid - 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
            return left;
        }
    
        int BinarySearchRight(vector<int>& nums, int target)
        {
            int left = 0;
            int right = nums.size() - 1;
            while(left <= right)
            {
                int mid = left + ((right - left) >> 1);
              
                if (nums[mid] > target)
                {
                    right = mid - 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
            return right;
        }
    };
    
    int main()
    {
    	Solution s;
    	vector<int>vec{0,0,0,1,2,3};
    	vector<int>v = s.searchRange(vec, 0);
    	for (auto it = v.begin(); it != v.end(); it++)
    	{
    		cout << *it << endl;
    	}
    	return 0;
    }

    看,这个时间,估计得有更高效的算法了。

    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    三、linux系统管理
    二、基本命令
    一、基本环境
    mysql-day4
    mysql-day3
    mysql-day2
    mysql-day1
    3、线性表的链式存储结构
    2、线性表之顺序表
    1、时间复杂度
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616324.html
Copyright © 2020-2023  润新知