搜索区间 - LintCode

描述
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]

样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]

挑战
时间复杂度 O(log n)

思路

#ifndef C61_H
#define C61_H
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    /**
    * @param A: an integer sorted array
    * @param target: an integer to be inserted
    * @return: a list of length 2, [index1, index2]
    */
    vector<int> searchRange(vector<int> &A, int target) {
        // write your code here
        vector<int> res{ -1, -1 };
        if (A.empty())
            return res;
        int left = 0, right = A.size() - 1;
        int mid = 0;
        //寻找最左边target
        //当mid等于left 或者 mid前一个元素不为target, mid就是最左边的target
        //如果mid前一个元素依旧是target,就把right置为mid - 1
        while (left <= right)
        {
            mid = left + (right - left) / 2;
            if (A[mid]>target)
                right = mid - 1;
            else if (A[mid] < target)
                left = mid + 1;
            else
            {
                if (mid == left || A[mid - 1] != target)
                {
                    res[0] = mid;
                    break;
                }
                else if (A[mid - 1] == target)
                {
                    right = mid - 1;
                }
            }
        }
        left = 0, right = A.size() - 1;
        //寻找最右边的target
        //当mid等于right 或者 mid的后一个元素不为target, mid就是最右边的target
        //如果mid的后一个元素认为target, 把left置为mid + 1
        while (left <= right)
        {
            mid = left + (right - left) / 2;
            if (A[mid]>target)
                right = mid - 1;
            else if (A[mid] < target)
                left = mid + 1;
            else
            {
                if (mid == right || A[mid + 1] != target)
                {
                    res[1] = mid;
                    break;
                }
                else if (A[mid + 1] == target)
                {
                    left = mid + 1;
                }
            }
        }
        return res;
    }
};
#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章