题目考察的知识点:二分查找

题目解答方法的文字分析:用递归进行查找,保留最小和最大的坐标。

本题解析所用的编程语言:c++

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param weights int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
    void search(vector<int>& weights, int& target, vector<int>& v, int left, int right)
    {
	    //判断临界
        if (right - left <= 1)
        {
            if (weights[left] == target)
            {
                v[0] = v[0] == -1 ? left : min(v[0], left);
                v[1] = max(v[1], left);
            }
            if (weights[right] == target)
            {
                v[0] = v[0] == -1 ? right : min(v[0], right);
                v[1] = max(v[1], right);
            }
            return;
        }
        int mid = (left + right) / 2 ;
        if (weights[mid] > target)
            search(weights, target, v, mid, right);
        else if (weights[mid] < target)
            search(weights, target, v, left, mid);
        else  
        {
            v[0] = v[0] == -1 ? mid : min(v[0], mid);
            v[1] = max(v[1], mid);
            search(weights, target, v, left, mid);
            search(weights, target, v, mid, right);
        }
    }
    vector<int> searchRange(vector<int>& weights, int target) {
        // write code here
        vector<int> v(2, -1);
        if (weights.size() == 0)
            return v;
        search(weights, target, v, 0, weights.size() - 1);
        return v;
    }
};