题目描述
统计一个数字在排序数组中出现的次数。
思路
遍历,计数
代码
class Solution {
public int search(int[] nums, int target) {
int count = 0;
for(int i = 0 ; i < nums.length ; i++){
if(nums[i] == target)
count ++;
}
return count ;
}
}
优化
忽略了重要信息:排序过的数组
题解
二分搜索
class Solution {
public int search(int[] nums, int target) {
// 搜索右边界 right
int i = 0, j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] <= target) i = m + 1;
else j = m - 1;
}
int right = i;
// 若数组中无 target ,则提前返回
if(j >= 0 && nums[j] != target) return 0;
// 搜索左边界 right
i = 0; j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] < target) i = m + 1;
else j = m - 1;
}
int left = j;
return right - left - 1;
}
}
作者:jyd
反思总结
1 思想类似于二分查找,区别还是有的。
2 寻找左边界,只要nums[mid]还大于等于target,j就继续往左逼近。
3 寻找有边界 , 只要nums[mid] 还小于等于target ,i 继续向右毕竟。