leetcode每日一题系列-剑指 Offer 53 - I. 在排序数组中查找数字 I

466 阅读1分钟

leetcode-剑指 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 
​
​
​
 注意:本题与主站 34 题相同(仅返回值不同):https://leetcode-cn.com/problems/find-first-and-last-
position-of-element-in-sorted-array/ 
 Related Topics 数组 二分查找 
 👍 170 👎 0

[题目链接]

leetcode题目链接

[github地址]

代码链接

[思路介绍]

思路一:暴力法

  • 这题暴力法太简单了O(n)扫描一次就行,我就不写了

时间复杂度O(n)


思路二:二分

  • 第一次扫描到起点,然后缩小区间,在找到右区间
public int search(int[] nums, int target) {
            //corner case
            if (nums.length == 0 || nums[0] > target || nums[nums.length - 1] < target) {
                return 0;
            }
            int n = nums.length, l = 0, r = n - 1,start = 0;
            //第一次寻找起点
            while (l < r) {
                int mid = (l - r + 1) / 2 + r;
                if (nums[mid] >= target) {
                    if (nums[mid] == target) {
                        if (mid == 0 || nums[mid - 1] < target) {
                            l = mid;
                            break;
                        }
                    }
                    r = mid - 1;
                } else {
                    l = mid;
                }
            }
            //未找到当前元素直接返回0;
            if (nums[l] != target) {
                return 0;
            }
            //第二次寻找终点
            //重新定义右端点,第二次寻值因为数组递增的原因可以直接找较大元素
            r = n - 1;
            start = l;
            while (l < r) {
                int mid = (l - r + 1) / 2 + r;
                if (nums[mid] == target) {
                    if (mid == n - 1 || nums[mid + 1] > target) {
                        r = mid;
                        break;
                    }
                    l = mid;
                }else{
                    r = mid - 1;
                }
            }
            return  r - start + 1;
        }

时间复杂度O(lgn)时间复杂度O(lg_{n})