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

来源:互联网 发布:蚁群算法优化问题 编辑:程序博客网 时间:2024/05/29 13:16

题目描述 :

统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.

解法:

使用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)

代码实现:

#include <stdio.h>#include <malloc.h>//找到排序数组中的第一个Kint 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 || middleIndex > 0 && data[middleIndex - 1] != k)return middleIndex;elseend = middleIndex - 1;}else if(middleData > k)end = middleIndex - 1;elsestart = middleIndex + 1;return GetFirstK(data,length,k,start,end);}//找到数组中最后一个K的位置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  || middleIndex < length-1 && data[middleIndex + 1] != k)return middleIndex;elsestart = middleIndex + 1;}else if(middleData < k)start = middleIndex + 1;elseend = 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){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;}void main(){int n;while(scanf("%d", &n) != EOF){int* data=(int*)malloc(sizeof(int));for(int i = 0; i < n; i++)scanf("%d", data+i);int k;printf("enter k: ");scanf("%d", &k);int number = GetNumberOfK(data, n, k);printf("数字%d在数组中出现%d次", k,number);}}



0 0
原创粉丝点击