思路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
- 二分查找+中心扩散
- 先通过二分查找找到目标值的下标,然后通过中心扩散来统计有多少个符合条件的值
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.