这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
题目描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 这个题目题意容易理解,有多种解法。可以用朴素解法,二分解法, Stream解法等多种方法解答。
- 其中 Stream 解法是Java 8 一个新的API,虽然Java 8 已经是事实标准了,但是 Stream 依旧使用的不多,我们可以多使用一下。
- Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。让程序员写出高效率、干净、简洁的代码。
- 这个题目主要使用了 filter, count 方法,使我们的代码更加简洁。
代码
- 朴素解法
public int search(int[] nums, int target) {
int ans = 0;
for (int num : nums) {
if (num == target) {
ans++;
}
}
return ans;
}
- 二分解法
public int search(int[] nums, int target) {
int ans = 0;
int left = 0;
int n = nums.length;
int right = n - 1;
int idx = -1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
idx = mid;
break;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (idx > -1) {
for (int i = idx - 1; i >= 0; i--) {
if (nums[idx] != target) {
break;
} else {
ans++;
}
}
for (int i = idx ; i < n; i++) {
if (nums[idx] != target) {
break;
} else {
ans++;
}
}
}
return ans;
}
- stream解法
public int search(int[] nums, int target) {
return (int) Arrays.stream(nums).filter(num -> (num == target)).count();
}
总结
- 朴素解法的时间复杂度是 O(n), 空间复杂度是 O(1)
- 二分解法的时间复杂度是 O(log(n)), 空间复杂度是 O(1)
- stream解法的时间复杂度是 O(n), 空间复杂度是 O(1)
- 坚持算法每日一题,加油!