Boyer–Moore majority vote algorithm 博耶-穆尔多数投票算法 leetcode第229题

import java.util.ArrayList;
import java.util.List;

public class MajorElements229 {
	public List<Integer> majorityElement1(int[] nums) //算法的精妙之处在于,如果不存在多于三分之一的元素的值,则次多元素是错误的,所有还要在最后做一次遍历和统计。
	{
		List<Integer> mylist=new ArrayList<Integer>();
		if(nums==null||nums.length==0) return mylist;
		 int number1 = nums[0], number2 = nums[0], count1 = 0, count2 = 0, len = nums.length;
		    for (int i = 0; i < len; i++) 
		    {
		        if (nums[i] == number1)//number1去记录最多的那个数
		            count1++;
		        else 
		        	if (nums[i] == number2)//number2去记录次多的那个数
		        		count2++;
		        	else 
		        		if (count1 == 0) //若当前的count被消耗为0,则用当前遍历到的数代替
		        				{
		        				number1 = nums[i];
		        				count1 = 1;
		        
		        				} 
		        		else 
		        			if (count2 == 0) 
		        			{
		        				number2 = nums[i];
		        				count2 = 1;
		            
		        			} 
		        			else 
		        			{
		        				count1--;//若当前数不等于记录着的前两大的数,则前两大的数减一
		        				count2--;
		        			}
		    }
		    count1=0;
		    count2=0;
		    for(int i:nums)
		    {
		    	if(i==number1)
		    		count1++;
		    	else if(i==number2)
		    		count2++;
		    }
		    if(count1>nums.length/3) mylist.add(number1);
		    if(count2>nums.length/3&&number1!=number2) mylist.add(number2);
		    return mylist;
	}
	public int majorityElement(int[] num) {
		         int n = num.length;
		         int candidate = num[0], counter = 0;
		        for (int i : num) {
		             if (counter == 0) {
		                 candidate = i;
		                 counter = 1;
		             } else if (candidate == i) {
		                counter++;
		           } else {
		                 counter--;
		             }
		         }
		        
		        
		         return candidate;
		 
		     }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums=new int[]{1,2,3};
		MajorElements229 mel=new MajorElements229();
		System.out.println(mel.majorityElement1(nums));
		
		

	}

}

229. Majority Element II

  My Submissions
Total Accepted: 29245  Total Submissions: 112956  Difficulty: Medium

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.


题目要求:在一个给定数组中查找多于总元素数三分之一的元素值,本题采用了 一次遍历便可 得出结果的  Boyer–Moore 算法,设置两个

变量 count1  count2  进行判断的  if  else 共有四对,依次判断   number=nums[i]   count=0.本题也可采用先排序再进行计算的方法,对于排序后的数组

仍然进行遍历,可以用  n/3为长度对结果进行遍历,若是元素从第一次出现的位置与其后的n/3元素相同,那该元素则出现频率多余三分之一,接着遍历i+n/3,

否则继续i=i+1;

博耶  穆尔算法实现如下:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值