题目描述:统计一个数字在排序数组中出现的次数。
思路:
1)最简单的思路:声明一个变量 i记录要查找的 target出现的次数,遍历数组,相等就记录,时间复杂度为 o(N)
2)见到排序数组中查找数字,首先要想到二分法查找,此时的时间复杂度为 O(logN)
二分法在排好序的数组中,搜索数字很常见;
要注意比较之后,左边下标 i要加1,往后移动一位;右边下标j要减1,往左移动一位。
注意循环条件的设施,小于等于。
手写代码:使用暴力的遍历
这道题主要就是为了熟悉二分法查找;注意 (i + j) / 2,向下取整
class Solution {
public int search(int[] nums, int target) {
int i = 0;
for(int j : nums){
if(j == target) i++;
}
return i;
}
}
答案思路:使用二分法
class Solution {
public int search(int[] nums, int target) {
int right = searchRight(nums,target);
int left = searchRight(nums,target - 1);
return right - left;
}
//二分法查找的方法封装
public int searchRight(int[] nums,int target){
int m = 0;//记录中点
int i = 0,j = nums.length - 1;//记录两端点
while(i <= j){
m = (i + j) / 2;
if(nums[m] <= target){
i = m + 1;//二分法,下标加1,往右找
}else{
j = m - 1;//下标减1,往左找
}
}
return j;
}
}