p20 数组中超过一半的数字 (leetcode 169)
一:解题思路
这道题目,有2种方法可以解决。第一种方法:循环遍历一遍数组,利用一个哈希表记录每个数字出现的次数,然后返回次数最多的那个数字。这个方法遍历了一遍数组时间复杂度为:O(n),用了一个哈希表,空间复杂度为:O(n)。
第二种方法:利用摩尔投票法。Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
第一种方法:C++
class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()==0) return -1;
unordered_map<int,int> hash_map;
int maxCountValue=0;
int maxCounts=0;
for(int i=0;i<nums.size();i++)
{
int count=hash_map[nums[i]]+1;
hash_map[nums[i]]=count;
if(count>maxCounts)
{
maxCountValue=nums[i];
maxCounts=count;
}
}
return maxCountValue;
}
};
第一种方法:Java
class Solution { public int majorityElement(int[] nums) { int maxValue=0,maxCount=0; Map<Integer,Integer> hash_map=new HashMap<>(); for(int i=0;i<nums.length;i++) { int newCount=hash_map.getOrDefault(nums[i],0)+1; hash_map.put(nums[i],newCount); if(newCount>maxCount) { maxCount=newCount; maxValue=nums[i]; } } return maxValue; } }
第二种方法:C++
class Solution { public: int majorityElement(vector<int>& nums) { int num = nums[0], count = 1; for (int i = 1; i < nums.size(); i++) { if (count == 0) { num = nums[i]; count = 1; } else if (nums[i] == num) { count++; } else { count--; } } return num; } };
第二种方法:Java
class Solution { public int majorityElement(int[] nums) { int num=nums[0],count=1; for(int i=1;i<nums.length;i++) { if(count==0) { num=nums[i]; count=1; } else if(num==nums[i]) { count++; } else { count--; } } return num; } }

浙公网安备 33010602011771号