每日一道算法题:数组中出现次数超过一半的数字
来源:互联网 发布:飞翔快递软件 编辑:程序博客网 时间:2024/05/16 05:51
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过了数组长度的一半,因此输出2。
解题思路:如果某个数字在数组中出现的次数超过了数组长度的一半,我们将数组排序后,数组中间的数字必为次数。按照这种思路,我们先将数组排序,再直接输出数组中间的数即可,代码如下:
#include <iostream>using namespace std;int partition(int *arr, int begin, int end){ int i = begin; int j = end; while (i < j){ while (i < j && arr[i] <= arr[j]){ i++; } if (i < j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } while (i < j && arr[i] <= arr[j]){ j--; } if (i < j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } return i;}void quicksort(int *arr, int begin, int end){ if (begin >= end){ return; } int p = partition(arr, begin, end); quicksort(arr, begin, p-1); quicksort(arr, p+1, end);}int main(){ int array[] = {3,2,4,5,3,1,2,3,3,3,3}; quicksort(array, 0, sizeof(array)/sizeof(array[0])-1); for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++){ cout << array[i] << " "; } cout << endl; cout << "次数超过数组一半的数字是: " << array[(sizeof(array)/sizeof(int))/2] << endl; system("pause"); return 0;}这种思路的时间复杂度主要依赖于排序算法的时间复杂度,即O(nlog(n))。我们再来考虑另外一种思路:依据题目意思,我们需要寻找的那个数出现的次数减去其他数字出现次数之和必定>=1,这样,从数组中每次取出两个不同的数字,直到数组最后取不出不同的数字为止,而每次取出的两个不同数字中不管包不包含我们需要寻找的那个数,最终数组剩余的同样的数字必定是需要的那个数。代码如下:
#include <iostream>using namespace std;int partition(int *arr, int left, int right){ int temp = arr[left]; while (left < right){ while ((left < right) && arr[right] >= temp){ right--; } arr[left] = arr[right]; while ((left < right) && arr[left] <= temp){ left++; } arr[right] = arr[left]; } arr[left] = temp; return left;}bool check(int *arr, int len, int result){ int count = 0; for (int i = 0; i < len; i++){ if (arr[i] == result){ ++count; } } bool flag = true; if (count * 2 <= len){ flag = false; } return flag;}int half_array(int *arr, int left, int right, int length){ if (arr == NULL || length <= 0){ return -1; } int index = partition(arr, left, right); int mid = length/2; while (index != mid){ if (index > mid){ index = partition(arr, left, index - 1); } else{ index = partition(arr, index + 1, right); } } int result = arr[mid]; if (!check(arr, length, result)){ return -1; } return arr[mid];}int main(){ int arr[] = {2,1,3,1,1}; int length = sizeof(arr)/sizeof(arr[0]); int half = half_array(arr, 0, length-1, length); cout << "超过数组一半的数字是: " << half << endl; system("pause"); return 0;}
0 0
- 每日一道算法题:数组中出现次数超过一半的数字
- 算法题:数组中出现次数超过一半的数字
- 算法题/数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字[算法]
- 数组中出现次数超过一半的数字[算法]
- 数组中出现次数超过一半的数字(算法)
- 算法题目---数组中出现次数超过一半的数字
- 【算法】数组中出现次数超过一半的数字
- 一道算法题:找出数组中出现次数超过一半的数
- [编程题]数组中出现次数超过一半的数字
- 数组中超过出现次数超过一半的数字
- 74.数组中超过出现次数超过一半的数字
- 74 数组中超过出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 【数组4】数组中出现次数超过一半的数字
- 数组4:数组中出现次数超过一半的数字
- box2d 碰撞过滤
- Android SlidingMenu 开源项目 侧拉菜单的使用(详细配置)
- 【HDU】4691 Front compression 后缀数组+RMQ
- Longest Consecutive Sequence
- arm9,11开发过程中eclipse下载插件zylincdt出现的问题
- 每日一道算法题:数组中出现次数超过一半的数字
- AVD的CPU的选择
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- C#线程池用法
- java 深入理解Java的接口和抽象类
- Android:解决Gradle DSL method not found: 'runProguard()' 问题
- C语言几种编译工具的优缺点及安装办法
- 学习JDBC笔记
- android项目中各个文件的介绍