※ Leetcode - Array - 169. Majority Element(快速找出数组中出现过一半以上次数的数,3种写法)

1.7.1 Problem Description

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

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

求给定数组中出现n/2次以上(不含n/2)的数字。

2. My solution1:Hash countO[n]

计算每个数出现的次数直接输出出现次数最多的数。

   int majorityElement(vector& nums)
    {
       maphh;
       int len=nums.size();
       int ansindex=0;
       for(int i=0;ihh[nums[ansindex]])
            ansindex=i;
       }
       return nums[ansindex];
    }

3.My solution2 排序输出中间数(O[nlogn])

偷懒的做法,因为已经表示出现次数多于一半,直接排序后输出中间的那个数(偶数奇数都是n/2位置)即可。

    int majorityElement(vector& nums)
    {
        int len=nums.size();
        sort(nums.begin(),nums.end());
        return nums[len/2];
    }

 

4. Brilliant Algorithm(O[n])

这种做法只有majority number存在的时候才可以使用,Brilliant Algorithm

每找出两个不同的element,则成对删除。最终剩下的一定就是所求的。

算法思路来自陆草纯的博客,这里把他在leetcode上的证明简单阐述一下。

 

扩展到[n/k]的情况:将每k个不同的element进行成组删除,剩下的就是所求的数字。

 

证明:

假设我们将这n个数每k个数编组(保证每个组内的k个数互不相同),这样可以有n/k个组,每个组只有一个Majority Number

 

由于这个数出现了超过n/k次,假设是n/k+1次。

 

那么当我们计算到第n/k-1个组时,由于“每个组只有一个Majority Number”,这里我们已经计算了(n/k-1)*k个数,而Majority Number出现了n/k-1次。

 

那么剩下的k个数中,必然存在至少两个Majority Number

 

在下文中的code中,我们最终保留的(Answer)实际是在最后一个组中重复出现的数字。自然也就是Majority Number

 

class Solution {
    int majorityElement(int[] num) {
        int major=num[0], count = 1;
        for(int i=1; i



你可能感兴趣的:(leetcode)