剑指 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 <= 数组长度 <= 50000
题目解析
看到数据有序并查找某个值立刻就要想到二分,遍历时间复杂度较高,不过也是一种解法。
暴力
class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return 0;
if (nums[0] > target) return 0;
int count = 0;
for (int n : nums) {
if (n == target) count++;
}
return count;
}
}
暴力优化
class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return 0;
if (nums[0] > target) return 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
return count(nums, i, target);
}
}
return 0;
}
private int count(int[] nums,int index, int target) {
int count = 1;
for (int i = index + 1; i < nums.length; i++) {
if (nums[i] == target) count++;
else return count;
}
return count;
}
}
第一次
二分法
class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return 0;
if (nums[0] > target) return 0;
int count = 0;
int l = 0;
int r = nums.length - 1;
int index = -1;
while(l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == target) {
index = mid;
count = 1;
break;
}
if (nums[mid] > target) {
r = mid - 1;
}
if (nums[mid] < target) {
l = mid + 1;
}
}
if (index == -1) return count;
for (int i = index - 1; i >= 0; i--) {
if (nums[i] == target) {
count++;
continue;
}
break;
}
for (int i = index + 1; i < nums.length; i++) {
if (nums[i] == target) {
count++;
continue;
}
break;
}
return count;
}
}
浙公网安备 33010602011771号