查找数组中的多数元素

时间:2019-02-12 03:51:38

标签: java arrays hashmap

解决方案1:没有哈希图

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[(nums.length/2)];
    }
}

解决方案2:HashMap

class Solution {
    public int majorityElement(int[] nums) {
        for(int i:nums){
            if(hm.containsKey(i)){
                int cnt=hm.get(i);
                if(cnt+1>nums.length/2) return i;
                hm.replace(i,cnt+1);
            }
            else{
                if(1> nums.length/2) return i;
                hm.put(i,1);
            }
        }
        return -1;
    }
}

哪种解决方案更快,为什么呢?每个解决方案的复杂性是什么?

问题:

给出大小为n的数组,找到多数元素。多数元素是出现超过⌊n / 2次的元素。

您可以假定数组为非空并且多数元素始终存在于数组中。

1 个答案:

答案 0 :(得分:1)

我认为使用HashMap的解决方案#2更快。

在解决方案1中,您正在对整个数组进行排序,这在最坏情况下的复杂度约为O(nlogn)。

在解决方案2中,您只是对数组进行了一次遍历,因此复杂度为O(n)。一旦发现一个元素计数为元素数量的一半,您甚至会中断(返回)。尽管此解决方案可能会占用一些额外的内存,但速度会更快。

请注意,我忽略了containsKey()get()等所花费的时间,因为Integer密钥将提供恒定的随机访问。像nums[index]这样的数组元素访问也是如此。