剑指 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;
    }

}
posted @ 2020-08-06 19:02  Haoyo  阅读(75)  评论(0)    收藏  举报