[容易]主元素

题目来源: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:关联容器map

unordered_map是不会按照first排序的。

可以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         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 };
posted @ 2016-05-09 21:35  Pearl_zju  阅读(201)  评论(0编辑  收藏  举报