[容易]主元素

题目来源:http://www.lintcode.com/zh-cn/problem/majority-number/

这道题注意题意,给出的数组一定是存在这个主元素的,不能给一个没有主元素的数组测试。

方法1:穷举法

使用两个for循环计算出每个元素出现的次数, 如果该元素出现次数大于数组元素的二分之一立即返回该元素。

可以accept的程序如下:

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers
 5      * @return: The majority number
 6      */
 7     int majorityNumber(vector<int> nums) {
 8         // write your code here
 9         int count=1;
10         for(int i=0;i<nums.size();i++)
11         {
12             for(int j=0;j<nums.size();j++)
13             {
14                 if(i!=j&&nums[i]==nums[j])
15                     count++;
16             }
17             if(count>nums.size()/2)
18                 return nums[i];
19         }
20         return 0;
21     }
22 };

方法2:排序法

对数组排序,中间数肯定是主元素。想一下,一根尺,如果有大于它长度二分之一的一段东西覆盖它,这段东西肯定会占据尺子的中间那个点。

可以accept的程序如下:

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers
 5      * @return: The majority number
 6      */
 7     int majorityNumber(vector<int> nums) {
 8         // write your code here
 9         sort(nums.begin(),nums.end());
10         return nums[nums.size()/2];
11     }
12 };

方法3:哈希表

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers
 5      * @return: The majority number
 6      */
 7     int majorityNumber(vector<int> nums) {
 8         // write your code here
 9         unordered_map<int, int> counts;
10         for (int i = 0; i < nums.size();i++)
11             if (++counts[nums[i]] > nums.size()/2)
12                 return nums[i];
13     }
14 };

方法4:抵消法

设置一个count来计数,candidate初始化为数组第一个元素。遍历数组,当数组中的元素与candidate相等时,就将count++;当数组中的元素与candidate不相等时,就将count--。如果count值小于0,那么就将candidate设置为当前的数组元素。那么遍历到最后一个元素的时候,candidate即为主元素了。

也可以理解成每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。 不难证明,如果存在出现频率超过半数的元素,那么数组中最后剩下的就只有该元素。

可以accept的程序如下:

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers
 5      * @return: The majority number
 6      */
 7     int majorityNumber(vector<int> nums) {
 8         // write your code here
 9         int candidate, count = 0;
10         for (int i = 0; i < nums.size(); i++) {
11             if (count == 0) {
12                 candidate = nums[i];
13                 count ++;
14             } else {
15                 if (candidate == nums[i]) {
16                     count ++;
17                 } else {
18                     count --;
19                 }
20             }
21         }
22         return candidate;
23     }
24 };
时间: 2024-11-08 22:33:04

[容易]主元素的相关文章

Majority Element:主元素

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. 求主元素:包含n个元素的数组中,如果一个元素的出现次数大

求数组主元素的递归算法

数组A是具有n个元素的数组,x是A中的一个元素,若A中有一半以上的元素与A相同,则称x是数组A的主元素.例如 ,数组A={1,3,2,3,3,4,3},元素3就是该数组的主元素. 1.移去数组中的两个不同元素后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素. 2.如果数组2k个元素中有k个元素相同(k<n/2),移去这2k个元素以后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素. 如果新数组只剩下一个元素,该元素可作为主元素的候选者.新数组是若干个相同元素,该元素可作为主

主元素问题 减治法

一个有n个元素的序列A中,出现次数大于n/2的元素称为主元素.现给定一个序列(保证存在主元素),求其主元素. 一种思路是Boyer和Moore提出的减治法,可以在线性时间内求得主元素.如果不确定序列是否存在主元素,还需要再加一个线性的判断. 以下假设A的主元素存在,且出现了k次,则其他元素出现的次数为n - k,二者的差记为c = 2k-n.可知x为主元素当且仅当 c > 0. 考查序列A的长度为2m的前缀P,若其中某个元素 x 出现的次数达到m,则此时可减而治之,分析如下,参考了数据结构课本的

【算法31】寻找数组的主元素(Majority Element)

题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以及数学证明,只是照搬的话好像意义也不是很大,希望找到些有代表性的题目在更新,另外希望能接着前面的<穷举递归和回溯算法终结篇>一系列如动态规划.贪心算法类的终结篇,在梳理自己知识结构的同时也能够帮助读者们更系统的学习算法思想.好了话不多说,进入正题. 问题描述 给定一个数组A[n], 定义数组的主元

线性时间内确定T[0:n]是否有一个主元素

设T[0:n-1]是n 个元素的数组.对任一元素x,设S(x)={ i | T[i]=x}.当| S(x) |>n/2 时,称x 为T 的主元素.设计一个算法,确定T[0:n-1]是否有一个主元素. 算法描述如下: a1 a2 a3 a4 … aj aj+1 … … an 首先取a1 存入m 中,计数器k 置为1. 然后让m 比较a1,a2…,如果与m 相同,则k 加1,如果不同,k 要减1. 这样执行下去, 可能会在比较完aj 时,k=0,这时从新取aj+1 存入m,k 置为1. 重复上述操作

lintcode 主元素解决方法

原题 给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 样例 给出数组[1,1,1,1,2,2,2],返回 1 主要思路 在不考虑时间复杂度的情况下,用for循环从第一个数开始与后面的数依次比较最后返回结果.代码如下: class Solution { public: /** * @param nums: A list of integers * @return: The majority number */ int majorityNumber(vector<

寻找主元素

主元素这个问题,有个nlogn的算法,但是还有比它更快的,有O(n)的算法,基本思想是,从头到尾遍历,先将第一个元素保存到一个变量中,然后依次往后遍历,每遍历到与它的值相同的元素时,就要将它的个数+1, 不同时-1, 这样是因为如果存在主元素,那么主元素的个数一定是大于n/2的,所以最后这样抵消下来剩下的一定是主元素,如果判断它不存在呢,就需要再遍历一遍,看最后找到的这个是不是主元素,其中有个细节就是当那个保存的个数减到0的时候怎么办,如果减到零,就让它等于当前遍历到的这个元素,代码如下, 1

lintcode.46 主元素

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 注意事项 You may assume that the array is non-empty and the majority number always exist in the array. 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Ye

主元素

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 1.抵消法---- 时间复杂度为O(n),空间复杂度为O(1) 一旦发现数组中存在两个不同的数,就都删除,直到剩下的数都一样. 此时剩下的数就是主元素.因为每次抵消操作之后,剩下来的数种,主元素一定也还是超过一半的. public int majorityNumber(ArrayList<Integer> nums) { int count = 0; int cur = nums.get(0); for(int