面试经典150题 day5
题目来源
我的题解
方法一 哈希表+统计
使用哈希表统计每个元素在数组中出现的次数,最后遍历一次哈希表找到次数大于n/2的key就行了
时间复杂度:O(n)
空间复杂度:O(n)
public int majorityElement(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for(int i:nums){
map.put(i,map.getOrDefault(i,0)+1);
}
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()>nums.length/2){
return entry.getKey();
}
}
return -1;//根据题意,这里不可能到达
}
方法二 双指针
使用双指针玩消消乐,只要两个指针指向的值不相同,就将两个指针对应的位置的值消除(在这里设置为Integer.MIN_VALUE),最后剩下的元素就是多数元素。
时间复杂度:O(n)
空间复杂度:O(1)
public int majorityElement(int[] nums) {
int n = nums.length;
if(n==1)
return nums[0];
int left=0,right=1;
while(right<n){
// 要注意两个指针的值因为Integer.MIN_VALUE相同
while(right<n&&nums[right]!=Integer.MIN_VALUE&&nums[left]==nums[right]){
right++;
}
//已经消除完,直接退出
if(right==n){
break;
}
nums[left]=Integer.MIN_VALUE;
nums[right]=Integer.MIN_VALUE;
right++;
//左指针的移动,可能先后移动到已经消除过的位置
while(left<n&&nums[left]==Integer.MIN_VALUE)
left++;
}
return nums[left];
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~