思路1

  1. 因为已经是排序的,只要直接遍历就可以了,找到第一个target后开始计数,统计有几个相同值
class Solution {
    public int search(int[] nums, int target) {
        if (nums.length == 0) return 0;
        int count = 0;
	// 遍历数组,因为数组排序从小到大。遇到大于目标值的数时候停止遍历
        for (int i = 0; i < nums.length ; i++) {
            if (nums[i] > target) return count;
            if(nums[i] == target) {
                count ++;
            }
        }
        return count;
    }
}

思路2

  1. 二分查找+中心扩散
  2. 先通过二分查找找到目标值的下标,然后通过中心扩散来统计有多少个符合条件的值
class Solution {
    public int search(int[] nums, int target) {
        // 1.二分查找找到对应的元素位置
        // 2.通过中心扩散查找相同数字出现的次数
        int index = find(nums, target, 0, nums.length - 1);
        int count = 0;
        // 获取到指定的元素下标
        if (index >= 0) {
            // 中心扩散
            int left = index;
            int right = index; 
            boolean ln = true; // 左边界到头
            boolean rn = true; // 右边界到头
            count += 1; // 存在下标则表示已经有一个目标值了
            while(ln || rn) {
                // 左边界
                if (left >= 0) {
                    if (nums[left] == nums[index]) {
                        if (left != index)
                            count ++;
                        left --;
                        
                    } else {
                        ln = false;
                    }
                } else {
                    ln = false;
                }

                // 右边界
                 if (right <= nums.length - 1) {
                    if (nums[right] == nums[index]) {
                        if (right != index)
                            count ++;
                        right ++;
                        
                    } else {
                        rn = false;
                    }
                } else {
                    rn = false;
                }
            }
        }
    
        return count;


    }
    // 二分查找找到特定的目标的下标
    int find(int[] nums, int target,int left, int right) {
        if (left > right) return -1;
        int mid = left + (right - left) / 2;
        if (nums[mid] == target){
            return mid;
        } else {
            if(nums[mid] <= target) 
                return find(nums, target,mid + 1, right);
            else 
                return find(nums, target,left, mid - 1);
        }
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹