剑指offer:数字在排序数组中出现的次数

题目描述:

统计一个数字在排序数组中出现的次数。

思路分析:

1. 直观思路是直接遍历一遍,统计。复杂度也只要O(n)。

2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成。分别二分查找第一个k和最后一个k。具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回;否则即第一个k在前面,则右边界r左移,继续递归查找。对于最后一个k的查找思路类似。

代码:

思路二:

 1 class Solution {
 2 public:
 3     int GetFirstK(vector<int>data, int k, int l, int r)
 4     {
 5         if(l>r)
 6             return -1;
 7         int mid = (l+r)/2;
 8         if(data[mid]>k)
 9         {
10             r = mid-1;
11         }
12         else if(data[mid]<k)
13         {
14             l = mid+1;
15         }
16         else
17         {
18             if((mid>0 && data[mid-1]!=k) || mid==0)
19                 return mid;
20             else
21                 r = mid-1;
22         }
23         return GetFirstK(data, k, l, r);
24     }
25     int GetLastK(vector<int>data, int k, int l, int r)
26     {
27         if(l>r)  //递归出口
28             return -1;
29         int mid = (l+r)/2;
30         if(data[mid]>k)
31         {
32             r = mid - 1;
33         }
34         else if(data[mid]<k)
35         {
36             l = mid + 1;
37         }
38         else
39         {
40             if((mid<data.size()-1&&data[mid+1]!=k) || mid == data.size()-1 )
41                 return mid;
42             else
43                 l = mid+1;
44         }
45         return GetLastK(data, k, l, r);
46     }
47     int GetNumberOfK(vector<int> data ,int k) {
48         if(data.size()<=0)
49             return 0;
50         int first = GetFirstK(data, k, 0, data.size()-1);
51         int last = GetLastK(data, k, 0, data.size()-1);
52         if(first==-1 && last ==-1)
53             return 0;
54         else
55             return last-first+1;
56     }
57 };

原文地址:https://www.cnblogs.com/LJ-LJ/p/10959963.html

时间: 2024-12-17 17:49:39

剑指offer:数字在排序数组中出现的次数的相关文章

剑指Offer——数字在排序数组中出现的次数

1.题目描述 统计一个数字在排序数组中出现的次数. 2.代码实现 package com.baozi.offer; /** * 统计一个数字在排序数组中出现的次数. * * @author BaoZi * @create 2019-07-14-8:52 */ public class Offer26 { public static void main(String[] args) { Offer26 offer26 = new Offer26(); int[] array = new int[]

剑指offer 数字在排序数组中出现的次数

因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int num=0; int size=data.size(); if(size>0){ int num1=getfk(data,0,size-1,k); int num2=getsk(data,0,size-1,k); if(num1!=-1 &&num2

剑指offer--34.数字在排序数组中出现的次数

时间限制:1秒 空间限制:32768K 热度指数:209611 本题知识点: 数组 题目描述 统计一个数字在排序数组中出现的次数. class Solution { public: int GetNumberOfK(vector<int> data ,int k) { return count(data.begin(), data.end(), k); } }; 原文地址:https://www.cnblogs.com/evidd/p/10625422.html

剑指Offer-36.数字在排序数组中出现的次数(C++/Java)

题目: 统计一个数字在排序数组中出现的次数. 分析: 给定一个已经排好序的数组,统计一个数字在数组中出现的次数. 那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这个性质来缩减时间复杂度的. 因为如果所给的数字在数组中出现,那么这个数字在数组中一定是连续的,那么可以利用二分查找所给出的数字的首尾索引. 程序: C++ class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if

剑指Offer36 数字在排序数组中出现的次数

1 /************************************************************************* 2 > File Name: 36_NumberOfKey.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 09时32分10秒 6 ***************************************

剑指offer:在排序数组中查找数字

题目: 统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4. # -*- coding: utf-8 -*- # @Time : 2019-07-13 15:10 # @Author : Jayce Wong # @ProjectName : job # @FileName : getNumberOfK.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : ht

剑指offer——56在排序数组中查找数字

题目描述 统计一个数字在排序数组中出现的次数. 题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度 可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似. 1 class Solution01 { 2 public: 3 int GetNumberOfK(vector<int> data, int k) { 4 if (data.size() == 0

剑指Offer--038-数字在排序数组中出现的次数

链接 牛客OJ:数字在排序数组中出现的次数 九度OJ:http://ac.jobdu.com/problem.php?pid=1349 GitHub代码: 038-数字在排序数组中出现的次数 CSDN题解:剑指Offer–038-数字在排序数组中出现的次数 牛客OJ 九度OJ CSDN题解 GitHub代码 038-数字在排序数组中出现的次数 1505-数字在排序数组中出现的次数 剑指Offer–038-数字在排序数组中出现的次数 038-数字在排序数组中出现的次数 题意 题目描述 统计一个数字

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

数字在排序数组中出现的次数(剑指offer)利用快排思想(O(logn))

数字在排序数组中出现的次数 参与人数:1216时间限制:1秒空间限制:32768K 通过比例:28.43% 最佳记录:0 ms|0K(来自 ) 题目描述 统计一个数字在排序数组中出现的次数. 题意:首先数组是个已经排列的有序递增序列!统计一个数出现的次数,相当于在有序的序列里插入一个数,那么我只要确定插入的位置,利用快排的思想,也可以说是二分,如果在数组中找到k,那么左右拓展边界就可以确定,该数在数组中出现的次数了. 一些特殊情况可以特判!比如k小于数组最小数,或者大于数组最大数: class