LeetCode No.169 多数元素

273 阅读1分钟

原题链接

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]
输出: 3

摩尔投票法

题干明确表示数组一定会有超过一半的数字,那么我们可以循环这个数组,已第一个数字作为众数,之后的循环中每一次遇到相同的数字,则count++,否则count--。在本题下,count永远会大于0,所以最终的众数就是我们所求的结果。

    public int majorityElement(int[] nums) {
        int zs =0,count =0;
        for(int i=0;i<nums.length;i++){
            if(count == 0){
                zs = nums[i];
            }
            count += (zs == nums[i]) ? 1 : -1;
        }
        return zs;
    }
  • 时间复杂度:O(n) 对数组一次遍历
  • 空间复杂度:O(1) 仅开辟了常量级空间

哈希映射

一次循环,将所有数字放入哈希表中。然后循环哈希表,找到出现次数最多的数字。

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

排序

对数组排序后, n/2 位置的数字永远是出现次数最多的数字。

  • 时间复杂度:取决于使用的排序算法,快排为 O(nlogn)
  • 空间复杂度:O(n)