剑指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  ************************************************************************/
 7
 8 #include <stdio.h>
 9
10 // 寻找第一个Key的下标
11 int GetFirstKey(int* nums, int length, int key, int left, int right)
12 {
13     if (nums==NULL || length<=0 || left>right)
14         return -1;
15
16     int middle = (left + right) / 2;
17     if (key == nums[middle])
18     {
19         if ((middle>0 && nums[middle-1]!=key) || middle==0)
20             return middle;
21         else
22             right = middle - 1;
23     }
24     else if (key > nums[middle])
25         left = middle + 1;
26     else
27         right = middle - 1;
28
29     return GetFirstKey(nums, length, key, left, right);
30 }
31
32 // 寻找最后一个Key的下标
33 int GetLastKey(int* nums, int length, int key, int left, int right)
34 {
35     if (nums==NULL || length<=0 || left>right)
36         return -1;
37
38     int middle = (left + right) / 2;
39     if (key == nums[middle])
40     {
41         if ((middle>0 && nums[middle+1]!=key && middle<length) || middle==length-1)
42             return middle;
43         else
44             left = middle + 1;
45     }
46     else if (key > nums[middle])
47         left = middle + 1;
48     else
49         right = middle - 1;
50
51     return GetLastKey(nums, length, key, left, right);
52 }
53
54 int GetNumberOfKey(int* nums, int length, int key)
55 {
56     int count = 0;
57     if (nums==NULL || length<=0)
58         return 0;
59
60     int first = GetFirstKey(nums, length, key, 0, length-1);
61     int last  = GetLastKey( nums, length, key, 0, length-1);
62
63     if (first>=0 && last>=0)
64         count = last - first + 1;
65
66     printf("count is %d\n", count);
67     return count;
68 }
69
70 int main()
71 {
72     int nums[] = {1, 2, 3, 3, 3, 3, 4, 5};
73     int length = 8;
74     int key = 3;
75
76     GetNumberOfKey(nums, length, key);
77 }
时间: 2025-01-12 11:07:16

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

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

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

剑指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——数字在排序数组中出现的次数

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

剑指offer 面试题38—数字在排序数组中出现的次数

题目: 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 解法一:O(n) 顺序遍历 解法二:O(logn) 用二分查找,分别找出第一个3,和最后一个3的位置,然后计算个数. #include <stdio.h> int GetFirstK(int* data,int length,int k,int start,int end) { if(start > end) return -1; int m

剑指offer面试题38:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 下面有m行,每行有一个整数k,表示要查询的数. 输出: 对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数. 样例输入: 81 2 3 3 3 3 4 513 样例输出: 4 //source:http