编程算法 - 数字在排序数组中出现的次数 代码(C)

数字在排序数组中出现的次数 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 统计一个数字在排序数组中出现的次数.

通过折半查找, 找到首次出现的位置, 再找到末次出现的位置, 相减即可.

时间复杂度O(logn).

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int GetFirstK (int* data, int length, int k, int start, int end) {
	if (start > end)
		return -1;
	int middleIndex = (start + end)/2;
	int middleData = data[middleIndex];

	if (middleData == k) {
		if ((middleIndex>0 && data[middleIndex-1]!=k) || middleIndex == 0)
			return middleIndex;
		else
			end = middleIndex-1;
	} else if (middleData>k)
		end = middleIndex-1;
	else
		start = middleIndex+1;
	return GetFirstK(data, length, k, start, end);
}

int GetLastK (int* data, int length, int k, int start, int end) {
	if (start > end)
		return -1;
	int middleIndex = (start+end)/2;
	int middleData= data[middleIndex];
	if (middleData == k) {
		if ((middleIndex<length-1 && data[middleIndex+1]!=k) || middleIndex == length-1)
			return middleIndex;
		else
			start = middleIndex+1;
	} else if (middleData < k)
		start = middleIndex+1;
	else
		end = middleIndex-1;
	return GetLastK(data, length, k, start, end);
}

int GetNumberOfK (int* data, int length, int k) {
	int number = 0;
	if (data == NULL && length <= 0)
		return number;
	int first = GetFirstK(data, length, k, 0, length-1);
	int last = GetLastK(data, length, k, 0, length-1);
	if (first > -1 && last > -1)
		number = last-first+1;
	return number;
}

int main(void)
{
	int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
	int k = 3;
	int result = GetNumberOfK(data, 8, k);
	printf("result = %d\n", result);

    return 0;
}

输出:

result = 4

编程算法 - 数字在排序数组中出现的次数 代码(C),布布扣,bubuko.com

时间: 2024-11-03 21:50:37

编程算法 - 数字在排序数组中出现的次数 代码(C)的相关文章

面试题38_数字在排序数组中出现的次数

题目描写叙述 统计一个数字在排序数组中出现的次数. 解题思路 数组是排序的,所以反复出现的数字是相邻排列的. 用二分查找算法,找到第一次出现的位置.和 最后一次出现的位置. 推断第一次出现的位置条件为:当前数字的前一个是否与之相等.若是则继续查找,否则该位置就是第一次出现的位置. 推断最后一次出现的位置条件为:当前数字的后一个是否与之相等,若是则继续查找,否则该位置就是最后一次出现的位置. 出现的次数= last - first +1 时间复杂度:O(logn) 实现代码 class Solut

【c语言】统计一个数字在排序数组中出现的次数

// 题目:统计一个数字在排序数组中出现的次数. //  比如:排序数组{1.2,3,3,3,3,4.5}和数字3,因为3出现了4次.因此输出4 有一种最简单的算法,遍历.可是有比它效率更高的 先看遍历: #include <stdio.h> #include <assert.h> int num_time(int *arr, int len, int a) { int i = 0; int count = 0; assert(arr != NULL); for (; i <

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3

《剑指offer》:[38]数字在排序数组中出现的次数

"沟通.学习能力就是看面试者能否清晰.有条理地表达自己,是否会在自己所得到的信息不够的情况下主动发问澄清,能否在得到一些暗示之后迅速做出反应纠正错误"                                                                                                                   ---陈黎明(MSoft-SDE) 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3

67. 数字在排序数组中出现的次数 (未完)

可以用hash表,本题使用二分法 二分查找算法模板 视频讲解:AcWing 67. 数字在排序数组中出现的次数 原文地址:https://www.cnblogs.com/make-big-money/p/12333702.html

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

九度oj 题目1349:数字在排序数组中出现的次数

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

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