数组中出现次数超过一半的数字


数组中出现次数超过一半的数字

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.size()==0)
            return 0;
    	int k=numbers[0];
        int count = 0;
        for(auto j : numbers){
            if(k==j) count++;
            else{
                count--;
                if(count==0){
                    k=j;
                    count++;
                }
            }
        }
        count = 0;
        for(auto i : numbers)
            if(i==k) count++;
        if(count>=numbers.size()/2)
        	return k;
        else
            return 0;
    }
};

思想是:引用这篇博客的原话http://www.cnblogs.com/hlxs/archive/2011/06/29/2093517.html

 方法三
     这个方法借用了别人的思路。
     在这里我做一下简单的分析。
     这个算法的时间复杂度是O(n),另外用了两个辅助变量。
     k用于临时存储数组中的数据,j用于存储某个数出现的次数。
     开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
     因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。

    下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意。

或者,引用讨论版cm问前程的原话http://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163

采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。 再加一次循环,记录这个士兵的个数看是否大于数组一般即可。


阅读更多
文章标签: 编程 c++ ACM
个人分类: ACM
上一篇枚举排列 -- 刘汝佳《算法竞赛入门经典》
下一篇int 转 string
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭