LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)

原创 2016年08月29日 21:40:40

原文

给定一个长度为n的整型数组,找出所有出现超过 ⌊ n/3 ⌋ 次的元素。算法应该运行在线性时间上,且进用O(1)空间。

提示:

它可能有多少个主要元素?

原文

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.

Hint:

How many majority elements could it possibly have?

分析

The Boyer-Moore Vote Algorithm solves the majority vote problem in linear time O(n)and logarithmic space O(logn). The majority vote problem is to determine in any given sequence of choices whether there is a choice with more occurrences than half of the total number of choices in the sequence and if so, to determine this choice. Note how this definition contrasts with the mode in which it is not simply the choice with the most occurrences, but the number of occurrences relative to the total length of the sequence.

Mathematically, given a finite sequence (length n) of numbers, the object is to find the majority number defined as the number that appears more than n/2 times.

import java.util.*;
public class MajorityVote {
     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--;
             }
        }

        counter = 0;
        for (int i : num) {
            if (i == candidate) counter++;
        }
        if (counter <= n / 2) return -1;
        return candidate;
    }
    public static void main(String[] args) {
        MajorityVote s = new MajorityVote();
        System.out.format("%d\n", s.majorityElement(new int[] {1, 2, 3}));
        System.out.format("%d\n", s.majorityElement(new int[] {2, 2, 3}));
    }
}

代码

Java

public class Solution {
    public List<Integer> majorityElement(int[] nums) {
        List<Integer> marjority = new ArrayList<>();
        int n = nums.length;
        int candidate1 = 0, candidate2 = 0, counter1 = 0, counter2 = 0;
        for (int i : nums) {
            if (candidate1 == i) {
                counter1++;
            } else if (candidate2 == i) {
                counter2++;
            } else if (counter1 == 0) {
                candidate1 = i;
                counter1 = 1;
            } else if (counter2 == 0) {
                candidate2 = i;
                counter2 = 1;
            } else {
                counter1--;
                counter2--;
            }
        }
        counter1 = 0;
        counter2 = 0;
        for (int i : nums) {
            if (i == candidate1) counter1++;
            else if (i == candidate2) counter2++;
        }
        if (counter1 > n/3) marjority.add(candidate1);
        if (counter2 > n/3) marjority.add(candidate2);
        return marjority;
    }
}
版权声明:本文为 nomasp柯于旺 原创,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

【LeetCode-面试算法经典-Java实现】【169-Majority Element(主元素)】

【169-Majority Element(主元素)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Chao】原...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月23日 06:38
  • 4481

Majority Number II——算法练习

No.1-2 Majority Number II Given an array of integers, the majority number is the number that occur...
  • lxf_44944
  • lxf_44944
  • 2015年02月13日 14:46
  • 824

多数投票算法(Boyer-Moore Algorithm)详解

多数投票算法(Boyer-Moore Algorithm)详解
  • kimixuchen
  • kimixuchen
  • 2016年10月11日 19:08
  • 2029

寻找多数元素的递归和迭代版本

多数元素定义:对于一组数,如果存在一个元素,该元素的个数大于n/2(向下取整),则该元素为多数元素。 采用蛮力方法是把每个元素和其他元素比较,并且对每个元素计数,但是这样的比较次数是n(n-1)/2=...
  • backspace780
  • backspace780
  • 2013年09月27日 20:45
  • 937

【LeetCode-面试算法经典-Java实现】【113-Path Sum II(路径和)】

【113-Path Sum II(路径和II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree and a sum, find al...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月12日 06:23
  • 2492

[LeetCode]Majority Element(献上膝盖的一题)

一、问题描述: Given an array of size n, find the majority element. The majority element is the element...
  • CristianoJason
  • CristianoJason
  • 2016年09月06日 14:45
  • 192

Majority Number——算法练习

题目: No.1 Majority Number Given an array of integers, the majority number is the number that occurs...
  • lxf_44944
  • lxf_44944
  • 2015年02月13日 14:40
  • 809

Majority Element众数元素的解法分析

找出非空数组中出现次数超过⌊n/2⌋的元素
  • Poison520
  • Poison520
  • 2017年03月09日 22:27
  • 225

Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先,这是一道远古之前的题的进化版: Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了,因为我也记不住了。。这道题意思就是ABCD四个数组,长...
  • MebiuW
  • MebiuW
  • 2016年11月16日 22:45
  • 2769

买卖股票的最佳时机I II III IV

买卖股票的最佳时机I II III IV I假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。II假设有一...
  • u010669349
  • u010669349
  • 2017年12月22日 22:47
  • 30
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)
举报原因:
原因补充:

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