剑指 Offer 53 - I. 在排序数组中查找数字 I
一、题目详情
原题链接:剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
二、暴力法
class Solution {
public int search(int[] nums, int target) {
int times = 0;
for(int i = 0;i < nums.length;i++){
if(nums[i] == target){
times++;
}
}
return times;
}
}
三、二分查找法
class Solution {
private int times = 0;
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0){
return 0;
}
return binarySearch(nums,target,0,nums.length - 1);
}
public int binarySearch(int[] nums, int target,int l,int r){
if(l > r){
return 0;
}
int mid = (l + r) / 2;
int midVal = nums[mid];
if(target > midVal){
return binarySearch(nums,target,mid + 1,r);
}else if(target < midVal){
return binarySearch(nums,target,l,mid - 1);
}else{
//此时定位到target值出现的位置
l = mid;
r = mid;
times++;
//向mid的左边扫描,将满足寻找元素的最左下标加入到result[0](不能超过被查询数组的左边界)
while(l - 1 >= 0 && nums[l] == nums[l - 1]){
times++;
mid--;
l--;
}
//向mid的右边扫描,将满足寻找元素的最右下标加入到result[1](不能超过被查询数组的右边界)
while(r + 1 < nums.length && nums[r] == nums[r + 1]){
times++;
mid++;
r++;
}
return times;
}
}
}