本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。
这种题目要熟练掌握数据结构,类似题见Top K Frequent Elements
解题思路一:
首先想到利用map,key代表元素值,value代表元素出现的次数,因为题目保证总有一个元素出现次数大于n/2,所以最后遍历map就行。时间复杂度O(n)
C++版本
int majorityElement(vector<int>& nums) {
int result = 0;
map<int, int> m;
map<int, int>::iterator iter;
for(int i = 0;i < nums.size();i++){
iter = m.find(nums[i]);
if(iter != m.end()){
iter->second++;
}
else{
m.insert(pair<int, int>(nums[i], 1));
}
}
for(iter = m.begin(); iter != m.end(); iter++){
if(iter->second > nums.size() / 2){
result = iter->first;
break;
}
}
return result;
}
Java版本
public int majorityElement(int[] nums) {
int result = 0;
Map<Integer, Integer> m = new HashMap<>();
for(int i = 0;i < nums.length;i++){
if(m.containsKey(nums[i])){
m.put(nums[i], m.get(nums[i]) + 1);
}
else{
m.put(nums[i], 1);
}
}
Iterator<Map.Entry<Integer, Integer>> iter = m.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<Integer, Integer> entry = iter.next();
Integer key = entry.getKey();
Integer value = entry.getValue();
if(value > nums.length / 2){
result = key;
break;
}
}
return result;
}
解题思路二:
使用投票算法,时间复杂度也是O(n),不过比上面效率高。代码逻辑思路主要通过设置freq变量,因为出现次数大于n/2的元素最后freq肯定大于0。
int majorityElement(vector<int>& nums) {
int result = 0;
int freq = 0;
for(int i = 0;i < nums.size();i++){
if(freq == 0){
freq++;
result = nums[i];
}
else if(result == nums[i]){
freq++;
}
else{
freq--;
}
}
return result;
}