解决方案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次的元素。
您可以假定数组为非空并且多数元素始终存在于数组中。
答案 0 :(得分:1)
我认为使用HashMap
的解决方案#2更快。
在解决方案1中,您正在对整个数组进行排序,这在最坏情况下的复杂度约为O(nlogn)。
在解决方案2中,您只是对数组进行了一次遍历,因此复杂度为O(n)。一旦发现一个元素计数为元素数量的一半,您甚至会中断(返回)。尽管此解决方案可能会占用一些额外的内存,但速度会更快。
请注意,我忽略了containsKey()
,get()
等所花费的时间,因为Integer密钥将提供恒定的随机访问。像nums[index]
这样的数组元素访问也是如此。