【LeetCode】在排序数组中查找数字 Java题解

652 阅读1分钟

这是我参与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();
    }

image.png

总结

  • 朴素解法的时间复杂度是 O(n), 空间复杂度是 O(1)
  • 二分解法的时间复杂度是 O(log(n)), 空间复杂度是 O(1)
  • stream解法的时间复杂度是 O(n), 空间复杂度是 O(1)
  • 坚持算法每日一题,加油!