主体为非递归的二分查找。由于题目要求得到第一个等于target的数据的下标,故而在nums[mid] == target时,多加了一个循环,以查找第一个等于target的数据。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int high = nums.size() - 1;
        int low = 0;
        int mid;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (nums[mid] == target) {
                int i;
                for (i = 0; i <= mid; i++) {//为查找第一个等于target的数据
                    if (nums[mid] != nums[mid - i])
                    return mid - i + 1;
                }
                    return mid - i + 1;
            }
            else if (nums[mid] < target){
                low = mid + 1;
            }
            else
                high = mid - 1;
        }
        return -1;
    }
};