Java 查找数组中的多数元素

Java 查找数组中的多数元素,java,arrays,hashmap,Java,Arrays,Hashmap,解决方案1:没有hashmap 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

解决方案1:没有hashmap

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⌋ 时代

您可以假设数组是非空的,并且数组中始终存在多数元素。

我认为使用HashMap的解决方案2速度更快

在解决方案1中,您将对整个阵列进行排序,最坏情况下的复杂性约为Onlogn

而在解决方案2中,您只需对阵列进行一次遍历,因此复杂性是存在的。当您发现一个元素的计数为元素数的一半时,您甚至会中断返回。虽然此解决方案可能需要一些额外的内存,但速度会更快


注意,我忽略了containsKey、get等所花费的时间,因为整数键将提供常量随机访问。数组元素访问的情况也是如此,比如nums[index]。

这个问题多数元素是出现在⌊ n/2⌋ 时代。和解决方案不匹配如果1>nums.length/2返回i;这是不对的…这似乎是一个家庭作业问题-你是否已经阅读了这里关于家庭作业问题的部分:考虑到这一点,你尝试了什么,或者你是如何尝试回答你关于解决速度和复杂性的问题的?