推荐方法一,二分查找效率更高!
1、题目描述
统计一个数字在排序数组中出现的次数。
2、算法分析
方法一:
排序数组 nums 中的所有数字 target形成一个窗口,记窗口的 左 / 右边界 索引分别为left 和 right ,分别对应窗口左边 / 右边的首个元素。
本题要求统计数字 target 的出现次数,可转化为:使用二分法分别找到 左边界 left 和 右边界 right ,易得数字 targettarget 的数量为 right - left - 1。
方法二:
直接使用while,遇到相等的直接count++计数即可。
方法三:
直接for循环,遇到相等的直接计数。
3、代码实现
class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0 || target < nums[0] || target > nums[nums.length -1]){
return 0;
}
return binary(nums,target) - binary(nums,target-1);
}
public int binary(int[] nums,int target){
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(target >= nums[mid]){
left = mid + 1;
}else{
right = mid - 1;
}
}
return left;
}
}
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
int count = 0;
while(left < right){
if(nums[left] == target){
count++;
left++;
}else{
left++;
}
}
return count;
}
}
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;
}
}