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

原创 2016年05月30日 09:56:43


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

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。 再加一次循环,记录这个士兵的个数看是否大于数组一般即可。


面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,5,4,2}。由于数字2在数组中出现了5词,超过数组长度的一半,因此输出2. 思路...
  • lskyne
  • lskyne
  • 2013年07月17日 21:43
  • 3834

每日一题:求数组中出现次数超过一半的元素

求数组n中出现次数超过一半的数 这个题目最简单的思路有两种:一种是排序然后顺序枚举统计,复杂度O(NLOGN),还有一种是直接枚举然后用MAP或者HASH去统计,时间复杂度是O(NLOGN(MAP)或...
  • u011077606
  • u011077606
  • 2015年01月13日 11:21
  • 1176

找出数组中出现次数超过一半或者超过1/3的元素

1、找出数组中出现次数超过一半的元素 int majorityElement(const vector& nums) { int m; int count = 0; for (auto num...
  • ouyangjinbin
  • ouyangjinbin
  • 2016年04月06日 23:02
  • 1706

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

过程: int MoreThanHalfNum(int* numbers, int length) { if (CheckInvalidArray(numbers, length)) return 0...
  • wangfengfan1
  • wangfengfan1
  • 2015年07月09日 16:41
  • 372

【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 解题思路: 解法一:基于Partition 函数的O(n)算法 解法二:根据数组组特点找出O(n)的算法...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月03日 06:56
  • 3386

找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。

数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。  分析:编程之美上也有这道题,不过它变换了题目的表述形式,如下:寻找发帖水王: Tango...
  • diudiuyoung
  • diudiuyoung
  • 2014年09月22日 19:31
  • 2601

剑指39_数组出现次数超过一半的数字

public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array.len...
  • hlang8160
  • hlang8160
  • 2017年12月31日 12:50
  • 24

数组中出现次数超过一半的数字||剑指offer

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2...
  • jiangjieqazwsx
  • jiangjieqazwsx
  • 2016年03月21日 17:38
  • 264

程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]

题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析:这是一道广为流传的面试题,包括百度、微软和Google在内的多家公司都曾经采用过这个题目。要几十分钟的时间里很好地解答这道题...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年02月24日 12:16
  • 646

剑指offer之面试题29:数组中出现次数超过一半的数字

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如...
  • sushauai
  • sushauai
  • 2016年05月05日 21:46
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组中出现次数超过一半的数字
举报原因:
原因补充:

(最多只允许输入30个字)