【数组】【打卡75天】面试题:3种方法:剑指 Offer 53 - I. 在排序数组中查找数字 I

推荐方法一,二分查找效率更高!

1、题目描述

统计一个数字在排序数组中出现的次数。

2、算法分析

方法一:

排序数组 nums 中的所有数字 target形成一个窗口,记窗口的 左 / 右边界 索引分别为left 和 right ,分别对应窗口左边 / 右边的首个元素。

本题要求统计数字 target 的出现次数,可转化为:使用二分法分别找到 左边界 left 和 右边界 right ,易得数字 targettarget 的数量为 right - left - 1。

方法二: 

        直接使用while,遇到相等的直接count++计数即可。

方法三:

        直接for循环,遇到相等的直接计数。

3、代码实现

class Solution {
    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0 || target < nums[0] || target > nums[nums.length -1]){
            return 0;
        }
        return binary(nums,target) - binary(nums,target-1);
    }

    public int binary(int[] nums,int target){
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(target >= nums[mid]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return left;
    }
}
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length;
        int count = 0;
        while(left < right){
            if(nums[left] == target){
                count++;
                left++;
            }else{
                left++;
            }
        }
        return count;
    }
}
class Solution {
    public int search(int[] nums, int target) {
        int count = 0;
        for(int i = 0;i < nums.length;i++){
            if(nums[i] == target){
                count++;
            }
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121310998
今日推荐