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

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

思路一:

先使用二分法查找数字的下标,如果找到了在这个下标的前后分别计数累加,否则直接返回0

 1 class Solution {
 2     public int search(int[] nums, int target) {
 3         
 4         // 二分法查找数字的下标
 5         int index = binaryFind(nums, target);
 6         int cnt = 0;
 7         // 如果找到了在这个下标的前后分别计数累加
 8         if(index != -1){
 9             cnt = 1;
10             int j = index + 1;  // 分别向左和向右统计与target相等的元素个数
11             int len = nums.length;
12             while(j < len && nums[j] == target){
13                 cnt++;
14                 j++;
15             }
16             j = index - 1;
17             while(j >= 0 && nums[j] == target){
18                 cnt++;
19                 j--;
20             }
21         }
22         return cnt;
23     }
24 
25     public int binaryFind(int[] nums, int target){
26         int left = 0, right = nums.length - 1;
27         int mid = 0;
28         while(left <= right){
29             mid = (left + right) / 2;
30             if(target < nums[mid]){
31                 right = mid - 1;
32             }else if(target > nums[mid]){
33                 left = mid + 1;
34             }else{
35                 return mid;
36             }
37         }
38         return -1;
39     }
40 
41 }

leetcode运行时间为0ms, 空间为42MB

复杂度分析:

时间复杂度:二分查找的时间为O(logn), 第二次往前后查找给定数字的查找次数是不确定的,最坏是O(n),所以时间复杂度为O(n)

空间复杂度:O(1)

思路二:

查找taget在数组的左右边界,左右边界做差即使出现的次数

 

思路三:

对思路二的改进

 

上一篇:进口电动隔膜泵原理特点及品牌(图)


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