OJ 169 Majority Element

本文介绍了一种在数组中找到出现次数超过一半的元素的方法,包括两种解法:一种是通过迭代并移除非目标元素直到剩下多数元素,另一种则是使用map进行计数。详细分析了算法的时间复杂度。

题目要求: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.
我的解法:

 1 int majorityElement(vector<int> &num) {
 2     int key = num.back();
 3     int k = num.size();
 4     k--;
 5     int i = k-1;
 6     while (i >= k/2)
 7     {
 8         if (num[i] != key)
 9         {
10             num[i] = num[k-1];
11             k--;
12             key = num[k-1];
13             k--;
14             i=k-1;
15             continue;
16         }
17         i--;
18     }
19     return key;
20 }

 

分析:首先要知道一个定理,如果一个序列中存在一个出现率大于1/2的元素,我们记为mE,那么如果去掉这个序列中的两个不相同的元素,新序列中一定存在一个出现率大于1/2的元素,依然是mE。
该算法最差情况需要在i指向第一个元素的时候,也就是算法的复杂度最差是O(n),最好的情况需要n/2。

这个问题还可以直接考虑,通过map来计数,来获取所求的元素。代码如下:

 1 int majorityElement(vector<int> &num) {
 2     map<int, int> count;
 3     for (int i : num)
 4     {
 5         if (++count[i] >= num.size() / 2)
 6         {
 7             return i;
 8         }
 9     }
10 }

 

转载于:https://www.cnblogs.com/charleschiu/p/4338250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值