剑指 Offer 53 - I. 在排序数组中查找数字 I

剑指 Offer 53 - I. 在排序数组中查找数字 I

遍历

从前到后遍历,找到一个+1

时间复杂度O(n),空间复杂度O(1)

class Solution {
    public int search(int[] nums, int target) {
        if(nums.length == 0)
        {
            return 0;
        }
        int ans = 0;
        for(int e : nums)
        {
            if(e == target)
            {
                ans++;
            }
        }
        return ans;
    }
}

二分

找到第一个出现target的下标和最后一个target的下标,两者相减即可

时间复杂度O(logn),空间复杂度O(1)

class Solution {
    public int search(int[] nums, int target) {
        int left = findpostion(nums,target,true);
        int right = findpostion(nums,target,false)-1;
        if(left < nums.length &&nums[left] == target && nums[right]==target)
        {
            return right-left+1;
        }
        return 0;
    }
    public int findpostion(int[] nums,int target,boolean flag)
    {
        int left = 0,right = nums.length-1,mid=0,ans=0;
        while(left <= right)
        {
            mid = (left+right)/2;
            if(nums[mid] > target || (flag && nums[mid] >= target))
            {
                right = mid-1;
                ans = mid;
            }
            else
            {
                left = mid + 1;
            }
        }
        return left;
    }
}

这里面有个处理,通过一个布尔变量flag,从而可以分别找到最前面的值和最后面的值,减少了一个函数的编写。

posted @ 2021-11-12 13:20  渴望成为大佬的菜鸡  阅读(37)  评论(0)    收藏  举报