【剑指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 };
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号