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

相关文章推荐

153. Find Minimum in Rotated Sorted Array\229. Majority Element II\Moore's voting algorithm

Find Minimum in Rotated Sorted Array 题目描述 代码实现153. Find Minimum in Rotated Sorted Array题目描述一个已经排好序的数...

摩尔投票算法(Boyer–Moore majority vote algorithm)

问题描述: 1. The majority vote problem is to determine in any given sequence of choices whether there is...
  • ywcpig
  • ywcpig
  • 2016-08-30 15:50
  • 1425

Boyer–Moore majority vote algorithm

思想来自维基百科 https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithmLeetCode 中有这样一题: ...

LeetCode-169.229. Majority Element II (JAVA)主要元素

LeetCode-169.229. Majority Element II (JAVA)主要元素

Boyer-Moore Majority Vote Algorithm的更一般性问题

1) 问题描述基本问题:对于一个给定数组A[0:n-1],找出出现次数大于⌊n/2⌋\lfloor n/2\rfloor 的元素,称为Majority element. 一般问题:对于一个给定数组A...
  • isunn
  • isunn
  • 2016-02-25 11:32
  • 644

【LeetCode】229.Majority Element II解题报告

【LeetCode】229.Majority Element II解题报告tags: Array 题目地址:https://leetcode.com/problems/majority-element...

[leetcode] 229. Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algori...

[leetcode] 229. Majority Element II 解题报告

题目链接:https://leetcode.com/problems/majority-element-ii/ Given an integer array of size n, find all...

Leetcode——229. Majority Element II

题目Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algor...

[Leetcode] 229. Majority Element II 解题报告

题目: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Th...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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