微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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  targetvalue.

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,8,10],target = 8
Output: [3,4]

Example 2:

Input: nums = [5,target = 6
Output: [-1,-1]

code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution
{
public:
    vector<int> searchRange(vector<int>& nums,int target)
    {
        vector<int> res{-1,-1};
        if(nums.empty()||nums.size()<0||nums.at(0)>target||target>nums.at(nums.size()-1))
            return res;

        int low=0;
        int height=nums.size()-1;
        int pos=-1;
        while(low<=height)
        {
            int mid=(low+height)/2;
            if(nums.at(mid)==target)
            {
                pos=mid;
                break;
            }

            if(target<nums.at(mid))
                height=mid-1;
            else
                low=mid+1;
        }
        if(pos==-1)
            return res;

        int i=1;
        int j=1;
        bool flag1=true;
        bool flag2=true;

        while(flag1||flag2)
        {
            if(pos-i>=0&&nums.at(pos-i)==target)
                ++i;
            else
                flag1=false;

            if(pos+j<nums.size()&&nums.at(pos+j)==target)
                ++j;
            else
                flag2=false;
        }
        res.at(0)=pos-(i-1);
        res.at(1)=pos+(j-1);
        return res;
    }
};

int main()
{
    vector<int> arr;
    Solution s;
    vector<int> res(s.searchRange(arr,1));
    for(auto i:res)
        cout<<i<<" ";
    cout<<endl;
    return 0;
}

code2

vector<int> searchRange(vector<int>& nums,int target) {
    int start = 0,end = nums.size(),mid,left,right;
    while (start < end) {
        mid = (start + end) / 2;
        if (nums[mid] >= target)
            end = mid;
        else
            start = mid + 1;
    }
    left = start;
    start = 0,end = nums.size();
    while (start < end) {
        mid = (start + end) / 2;
        if (nums[mid] > target)
            end = mid;
        else
            start = mid + 1;
    }
    right = start;
    return left == right ? vector<int> {-1,-1} : vector<int> {left,right-1};
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。