34.在排序数组中查找元素的第一个和最后一个位置

题目
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

思路
采用双指针法,从开头和结尾分别搜索target,一开始代码很简单,但是考虑因素不全,加了一堆if else判断

#include 
#include 
using namespace std;
class Solution {
public:
    vector searchRange(vector& nums, int target) {
        vector  result;
        if (nums.size() ==0)
        {
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        int left = 0, right = nums.size() - 1;
        while (right > left)
        {
            do
            {
                ++left;
            }
            while (nums[left] != target && left < nums.size() - 1);
            do
            {
                --right;
            }
            while (nums[right] != target && right > 0);
        }
        if (nums.size() == 1 && nums[0] == target)
        {
            result.push_back(0);
            result.push_back(0);
            return result;
        }
        else if (nums.size() == 1 && nums[0] != target)
        {
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        else if (right == 0 && left == nums.size() -1 && nums[left] != nums[right]  )
        {
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        else if (nums[left] == target && nums[right] == target)
        {
            result.push_back(right);
            result.push_back(left);
            return result;
        }
    }
};

int main(int argc, char* argv[])
{
    vector test = { 5,7,7,8,8,10 };
    int target = 8;
    vector result = Solution().searchRange(test, target);
    system("pause");
    return 0;
}

你可能感兴趣的:(34.在排序数组中查找元素的第一个和最后一个位置)