【剑指offer】35. 数字在升序数组中出现的次数

总目录:

算法之旅导航目录

 

1.问题描述

给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数

数据范围:0≤n≤1000,0≤k≤100,数组中每个元素的值满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(logn)

 

2.问题分析

主要是要求时间复杂度为O(logn)

 1二分法,注意数据源是有序的,二分时注意取舍是否走分支,分到单个元素时判断大小


3.代码实例

二分法

 1 class Solution {
 2   public:
 3     int getCount(vector<int>& data, int start, int end, int tgtVal) {
 4         //数据源长度保护
 5         int dataSize = data.size();
 6         if (dataSize <= 0) {
 7             return 0;
 8         }
 9         if (start > end || start >= dataSize || end >= dataSize) {
10             return 0;
11         }
12 
13         //本层逻辑
14         if (start == end) {
15             return data[start] == tgtVal ? 1 : 0;
16         }
17 
18         //调用递归
19         int mid = (start + end) / 2;
20         //目标值在左侧,只计算左侧
21         if(data[mid]>tgtVal){
22             return getCount(data, start, mid, tgtVal);
23         }
24 
25         //目标值在右侧,只计算右侧
26         if(data[mid]<tgtVal){
27             return getCount(data, mid + 1, end, tgtVal);
28         }
29 
30         //两边都要统计
31         return getCount(data, start, mid, tgtVal)
32                + getCount(data, mid + 1, end, tgtVal);
33     }
34 
35 
36     int GetNumberOfK(vector<int> data, int k) {
37         return getCount(data, 0, data.size() - 1, k);
38     }
39 };
View Code
posted @ 2022-11-18 16:30  啊原来是这样呀  阅读(36)  评论(0)    收藏  举报