题目来源: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