搜索區間 - 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章