【编程题目】数组中超过出现次数超过一半的数字 ☆

74.数组中超过出现次数超过一半的数字(数组)
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比

/*
74.数组中超过出现次数超过一半的数字(数组)
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
*/

//思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比

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

int find(int * in, int len)
{
    if(len == 0)
    {
        return 0;
    }
    if(len % 2 == 1) //奇数,加一轮全部比较
    {
        int i = 0;
        int count = 0;
        for(i = 0; i < len; i++)
        {
            if(in[i] == in[len - 1])
                count++;
        }
        if(count > (len-1)/2)
        {
            return in[len - 1];
        }
    }

    int * remain = (int *)malloc(len / 2 * sizeof(int)); //无法释放了..??
    int remainlen = 0;
    for(int i = 0; i < len; i+=2)
    {
        if(in[i] == in[i+1])
        {
            remain[remainlen++] = in[i];
        }
    }
    return find(remain, remainlen);

}

int main()
{
    int a[10] = {5,6,7,8,5,5,5,5,5,6};
    int ans = find(a, 10);
    return 0;
}

我的代码有个大问题,自己开辟的内存无法释放。在网上看答案,发现其实不用写得这么麻烦的...

网上的思路:http://www.oschina.net/code/snippet_859732_22139

每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模缩小。如果每次删除两个不同的数,那么剩下的数字里最高频数出现的频率一样超过一半,不断重复这个过程,最后剩下的将全是同样的数字。时间复杂度是O(n)

int findmostappear(int *a,int len)
{
    int candidate=0,count=0;
    for(int i=0;i<len;i++)
    {
        if(count==0)
        {
            candidate=a[i];
            count=1;
        }
        else
        {
            if(candidate==a[i])
                count++;
            else
                count--;
        }
    }
    return candidate;
}

【编程题目】数组中超过出现次数超过一半的数字 ☆

时间: 2024-07-31 16:21:47

【编程题目】数组中超过出现次数超过一半的数字 ☆的相关文章

数组中超过出现次数一半的数字 【微软面试100题 第七十四题】

问题要求: 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. 参考资料:编程之美2.3 寻找发帖水王 问题分析: 方法1 对数组排序,然后顺次查找其中最多的: 方法2 对数组排序,最中间一个肯定为要找的数字,时间复杂度O(NlogN): 方法3 每次消去数组中两个不同的数,最后剩下的肯定为要找的数字,时间复杂度O(N). 方法3代码1如下,以下是图解代码1 代码实现: //代码1#include <stdio.h> int Find(int* ID, int N); int ma

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

C++算法之 数组中出现次数超过一半的数字

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 看到这个题目,我自己想到的方法: 另外申请一个数组B,用来存放该数组A 元素出现的次数,再遍历B数组,出现次数最多的就是:但是这个如果A数组当中的元素有个是1000,那么B数组就要申请至少1000,空间浪费太严重. 方法二: 类似于消除原理,既然某个数字大于长度的一半,那么我们就遍历数组,如果两

数组中出现次数超过一半的数字(C++剑指Offer详解)

第一次见到这个题,感觉简单到爆,不就是sort函数排个序,取中位数,遍历一遍计个数不就OK了吗?但是面试时,sort可能会让你自己去实现,或者说,题目要求:不能修改输入的数组呢???第一种方法(基于Partition函数)注意:此方法修改了输入的数组 核心:出现次数超过一半的数字,排序后中位数肯定是这个数字 解题思路:通过Partition函数,随机选出数组中的一个元素(我的代码中默认是数组中第一个元素),并且通过快排的思想,小的元素移到随机值前面,大的元素移到随机值的后面,然后返回随机值最后的

编程算法 - 数组中出现次数超过一半的数字 代码(C)

数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. 1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求. 2. 使用计数方法依次比較. 代码:  方法1: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */

47. 数组中出现次数超过一半的数字[Number appears more than half times]

[题目]:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. 例如长度为9的数组{1,2,3,2,2,2,5,4,2}中次数超过了数组长度的一半的数字为2,而长度为8的数组{1,2,3,2,2,2,5,4}则为非法输入. [思路一]:先对数组进行排序,再遍历排序后的数组,统计每个数的次数,出现次数最大的数即为要找的数. 时间复杂度:O(nlgn)+ O(n)= O(nlgn):空间复杂度:O(1). [思路二]:先对数组进行排序,出现次数超过数组长度的一半的数必然是数组中间的那个数.

数据结构-数组中出现次数超过一半的数字

题目:数字中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:首先进行排序,因为大于一半,所以说经过排序之后的数组,如有次数大于的话说明那个数肯定是数组中间的那个数. #include <iostream> using namespace std; void QickSort(int *a,int n,int low,int high){ int i=l

【剑指offer】十九,数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:找数组中出现次数超过一半的数字,我们一半可以采用两种方法,一是使用快排,对数组进行排序,然后直接输出排序数组中间位置的数.第二种是使用HashMap<Integer,Integer>,key是数组中的数字,value为其在数组中出现的次数,顺序扫描数组,记录下数组出现的次数,输出大于数组长

数组中出现次数超过一半的数字-剑指Offer

数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路 若一个数出现的次数超过长度的一半,那么这个数出现的次数比数组里的其他数都多 用num来存数组的数,times来存次数,遍历数组,遇到一个数若跟num相等,times++,若不相等,times--,若times为零,则num存入下一个数,最后n