[编程之美]发帖“水王”问题

原创 2016年05月30日 21:05:26

        编程之美2.3节。正好对应leetcode上的第169题Majority Element和229题Majority Element II,该类问题可以总结为线性时间查找固定频率元素,应该使用Moore's voting algorithm,详细说明见链接


169. Majority Element

 

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.





    public static int majorityElement(int[] nums) {
    	int re=0;
    	int count=0;
    	for(int i=0; i<nums.length; i++){
    		if(count==0){
    			re=nums[i];
    			count=1;
    		}else{
    			if(nums[i]==re){
    				count++;
    			}else{
    				count--;
    			}
    		}
    	}
    	return re;
    }


229. Majority Element II

 

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.









    public static List<Integer> majorityElement(int[] nums) {
    	List<Integer> re=new ArrayList<Integer>();
    	int[] num=new int[2];
    	int count0=0;
    	int count1=0;
    	
    	for(int i=0; i<nums.length; i++){
    		if(num[0]==nums[i]){
    			count0++;
    		}else if(num[1]==nums[i]){
    			count1++;
    		}else if(count0==0){
    			count0=1;
    			num[0]=nums[i];
    		}else if(count1==0){
    			count1=1;
    			num[1]=nums[i];
    		}else{
    			count0--;
    			count1--;
    		}
    	}
    	count0=0;
    	count1=0;
    	for(int i=0; i<nums.length; i++){
    		if(nums[i]==num[0]){
    			count0++;
    		}else if(nums[i]==num[1]){
    			count1++;
    		}
    	}
    	if(count0>nums.length/3){
    		re.add(num[0]);
    	}
    	if(count1>nums.length/3){
    		re.add(num[1]);
    	}
    	return re;
    }

总结:两个问题基本一样,核心思想就是频率超过n/3的数组肯定只有两个,所以建立一个长度为2的数组num,还有两个变量count0和count1分别记录num[0]和num[1]元素出现的次数,遍历一次以后数组中两个元素肯定是出现频率最高的两个,最后再遍历一次看数组中的元素是否满足超过n/3的要求。

版权声明:本文为博主原创文章,转载请注明出处。

编程之美---发帖“水王”扩展问题

扩展问题一:随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?问题求解:上...
  • will130
  • will130
  • 2015年05月26日 14:54
  • 657

编程之美:水王问题及扩展

题目描述:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水...
  • gao1440156051
  • gao1440156051
  • 2016年06月08日 12:07
  • 657

编程之美---超级水王扩展题目

/** * 一个数组中有N个数字出现的次数都超过数组总长度L的1/(N+1),查找这些ID * */ #include #include #include #include #inclu...
  • leewon1988
  • leewon1988
  • 2013年08月25日 15:11
  • 588

《编程之美》——寻找发帖“水王”

问题: 论坛中“水王”发帖的数目超过了帖子总数的一半,如果有当前论坛所有帖子的列表,求“水王”的ID。分析与解法: 一般的想法是根据ID对列表排序,若编号从0开始第N/2个ID即为“水王”的ID。...
  • zengzhen_CSDN
  • zengzhen_CSDN
  • 2015年11月19日 18:03
  • 657

编程之美——发帖水王

问题是,在论坛上一个人非常喜欢发帖,且他发的帖子数目超过了帖子总数的一半,要想快速的找出这个ID,怎么办?  首先可以先把所有帖子按ID进行排序,把排序结果存进数组里面,然后直接索引N/2即...
  • wangyudong211
  • wangyudong211
  • 2014年03月24日 10:20
  • 457

编程之美--发帖水王

转载:http://blog.csdn.net/v_july_v/article/details/6890054 第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成 ...
  • jtlyuan
  • jtlyuan
  • 2012年03月29日 11:29
  • 7854

编程之美发帖水王

这就和之前海涛的一样哦,一个数超过数组一半,求出这个数。 实际上就是顺序遍历 遇到不同的减一 遇到相同的加1 记录其为0的情况, 转自 http://blog.csdn.net/supe...
  • hiphopmattshi
  • hiphopmattshi
  • 2012年09月16日 00:00
  • 7525

编程之美--寻找发帖水王

1、题目:找出数组中出现次数超过
  • woshibendangao
  • woshibendangao
  • 2014年08月18日 11:24
  • 436

编程之美-寻找发帖水王

Type Find(Type *ID,int N) {//寻找发帖"水王",假设只有一个 Type candidate; int nTimes,i; for( i = nTimes = 0; ...
  • hello2sys_cs
  • hello2sys_cs
  • 2013年03月13日 13:10
  • 348

编程之美---寻找发帖“水王”

问题描述:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水...
  • will130
  • will130
  • 2015年05月26日 10:56
  • 468
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[编程之美]发帖“水王”问题
举报原因:
原因补充:

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