Majority Number

Question

  1. Given an array of integers, the majority number is
  2. the number that occurs more than half of the size of the array. Find it.
  3. Example
  4. Given [1, 1, 1, 1, 2, 2, 2], return 1
  5. Challenge
  6. O(n) time and O(1) extra space

题解

找出现次数超过一半的数,使用哈希表统计不同数字出现的次数,超过二分之一即返回当前数字。这种方法非常简单且容易实现,但会占据过多空间,注意到题中明确表明要找的数会超过二分之一,这里的隐含条件不是那么容易应用。既然某个数超过二分之一,那么用这个数和其他数进行 PK,不同的计数器都减一(核心在于两两抵消),相同的则加1,最后返回计数器大于0的即可。综上,我们需要一辅助数据结构如pair<int, int>.

C++

  1. int majorityNumber(vector<int> nums) {
  2. if (nums.empty()) return -1;
  3. int k = -1, count = 0;
  4. for (auto n : nums) {
  5. if (!count) k = n;
  6. if (k == n) count++;
  7. else count--;
  8. }
  9. return k;
  10. }

Java

  1. public class Solution {
  2. /**
  3. * @param nums: a list of integers
  4. * @return: find a majority number
  5. */
  6. public int majorityNumber(ArrayList<Integer> nums) {
  7. if (nums == null || nums.isEmpty()) return -1;
  8. // pair<key, count>
  9. int key = -1, count = 0;
  10. for (int num : nums) {
  11. // re-initialize
  12. if (count == 0) {
  13. key = num;
  14. count = 1;
  15. continue;
  16. }
  17. // increment/decrement count
  18. if (key == num) {
  19. count++;
  20. } else {
  21. count--;
  22. }
  23. }
  24. return key;
  25. }
  26. }

源码分析

初始化count = 0, 遍历数组时需要先判断count == 0以重新初始化。

复杂度分析

时间复杂度 O(n), 空间复杂度 O(1).