【LeetCode】Majority Element 解题报告

来源:互联网 发布:c语言入门经典 编辑:程序博客网 时间:2024/05/01 04:56

Majority Element

[LeetCode]

https://leetcode.com/problems/majority-element/

Total Accepted: 110538 Total Submissions: 268289 Difficulty: Easy

Question

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.

Ways

第一想法,用HashMap。嗯。之前也这么做过,但是一想就不对,肯定效率太差。

然后也没想到太好的方法。但是官方给了几个思路:

时间复杂度: O(n2) — 蛮力法: 依次检查每一个元素是否为众数

时间复杂度: O(n), 空间复杂度: O(n) — 哈希表: 维护一个每一个元素出现次数的哈希表, 然后找到出现次数最多的元素

时间复杂度: O(n log n) — 排序: 在排序后找出连续重复出现次数最多的元素

平均时间复杂度: O(n), 最坏复杂度: 无穷大 — 随机算法: 随机选取一个元素计算其是否为众数. 如果不是, 就重复上一步骤直到找到为止。 由于选出众数的概率 1 / 2, 因此期望的尝试次数 < 2

时间复杂度: O(n log n) — 分治法: 将数组拆成2半, 然后找出前一半的众数A和后一半的众数B。则全局众数要么是A要么是B。 如果 A == B, 则它自然而然就是全局众数。 如果不是, 则A和B都是候选众数, 则至多只需要检查这两个元素的出现次数即可。 时间复杂度, T(n) = T(n/2) + 2n = O(n log n).

时间复杂度: O(n) — Moore投票算法: 我们维护一个当前的候选众数和一个初始为0的计数器。遍历数组时,我们看当前的元素x:

如果计数器是0, 我们将候选众数置为 x 并将计数器置为 1
如果计数器非0, 我们根据x与当前的候选众数是否相等对计数器+1或者-1
一趟之后, 当前的候选众数就是所求众数. 时间复杂度 = O(n).
时间复杂度: O(n) — 位操作法: 我们需要32次迭代, 每一次计算所有n个数的第i位的1的个数。由于众数一定存在,那么或者1的个数 0的个数 或者反过来(但绝不会相同)。 众数的第i位一定是计数较多数字。

这个投票方法挺好玩。就是多数派问题。

这个思路是这样的:

对于vi,如果c此时为未知状态,则c=v[i],t=1,递增i。
如果c==v[i],++t,递增i。
如果c!=v[i],–t,如果t==0,将c置为未知状态,递增i。
所有投票处理完毕后,如果c为未知状态,则说明不存在任何候选人的得票数过半,否则重新遍历数组v,统计候选人c的实际得票总数,如果c的得票数确实过半,则c就是最终结果。

比如对于数据[1,2,1,1,3,1,4,4]

i       1   2   3   4   5   6   7   8v[i]    1   2   1   1   3   1   4   4c       1   ?   1   1   1   1   1   ?t       1   0   1   2   1   2   1   0

程序运行的最终结果,c处于未知状态,说明对于投票数组v,不存在任何候选人的得票数过半。

如果v[1…9]={1,2,1,1,3,1,4,4,1},此时c的最后状态为1,重新遍历数组v,查看候选人1的得票数是否确实过半,统计结果1出现了5次,大于9/2,所以候选人1的票数过半。\

因为题目中已经保证了存在数据出现过半。所以结尾的c那个元素一定不是不确定状态,直接返回就好。

我的代码:

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

AC:3ms

参考文献:多数派问题

Date

2016/5/1 0:00:49

0 0