题目
题链:剑指 Offer 53 - I. 在排序数组中查找数字 I
题解
两种解法第一种最最显而易见的就是直接遍历计数暴力解决、第二种就是二分法降低时间复杂度。
解法一:暴力遍历
遍历完整个数组即可、时间复杂度为O(n),空间复杂度为O(1)
class Solution {
public int search(int[] nums, int target) {
int res = 0;
for(int i = 0;i < nums.length ; i++){
if(target == nums[i]) { res++; }
}
return res;
}
}
解法二:二分查找
本题二分有两种方法计数、一是我自己写的找到一个下标后,左右遍历计数。
public int search(int[] nums, int target) {
int mid = binarySearch(nums,0, nums.length - 1, target);
if (mid == -1){
return 0;
}
int i = mid-1, res = 1 ;
while (i >= 0 && nums[i] == target){
res++;
i--;
}
i = mid + 1;
while (i< nums.length && nums[i] == target){
res ++;
i++;
}
return res;
}
int binarySearch(int[] nums,int l,int r,int target){
if (l > r){
return -1;
}
int mid = (l+r)/2;
if (nums[mid] == target){
return mid;
}else if (nums[mid] > target){
return binarySearch(nums,l,mid - 1,target);
}else {
return binarySearch(nums,mid+1,r,target);
}
}
第二种是找出左右边界下标直接相减就可以找出。
K神大佬详细题解:面试题53 - I. 在排序数组中查找数字 I(二分法,清晰图解)
class Solution {
public int search(int[] nums, int target) {
return help(nums,target) - help(nums,target-1);
}
int help(int[] nums, int tar){
int l = 0,r =nums.length - 1;
while (l <= r){
int mid = (l+r)/2;
if (nums[mid] <= tar){
l = mid+1;
}else {
r = mid-1;
}
}
return l;
}
}