您的位置:首页 > 其它

题目:主元素 III

2015-08-26 00:06 567 查看

给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k。

您在真实的面试中是否遇到过这个题?

Yes

样例

给出数组 [3,1,2,3,2,3,3,4,4,4] ,和 k = 3,返回 3

注意

数组中只有唯一的主元素

挑战

要求时间复杂度为O(n),空间复杂度为O(k)

标签 Expand

相关题目 Expand

解题思路:
维护一个有k-1个元素的map,value为值,key为出现的次数。
1.先遍历数组去初始化k-1个元素的map,若数值不存在map中,则加入map中,若存在则更新map。
2.再遍历剩下数组,若不存在map中则加入,若map中存在值,则更新map,若map中的值是0则删除该值,加入新值。
public class Solution {
/**
* @param nums: A list of integers
* @param k: As described
* @return: The majority number
*/
public int majorityNumber(ArrayList<Integer> nums, int k) {
// write your code
int canlen = 0 ;
int start = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0;i<nums.size()&&canlen<k;i++){
int tmp = nums.get(i);
if(!map.containsKey(tmp)){
map.put(tmp, 1);
}
canlen++;
}
for(int j=canlen;j<nums.size();j++){
int tmp = nums.get(j);
if(map.containsKey(tmp)){
map.put(tmp, map.get(tmp)+1);
}else{
if(map.values().contains(0)){
map.put(tmp, 1);
Integer  delInteger = null;
for(java.util.Map.Entry<Integer, Integer> entry:map.entrySet()){
if(0==entry.getValue()){
delInteger = entry.getKey();
break;
}
}
map.remove(delInteger);
}else{
for(java.util.Map.Entry<Integer, Integer> entry:map.entrySet()){
map.put(entry.getKey(), entry.getValue()-1);
}
}
}
}
HashMap<Integer, Integer> newmap = new HashMap<>();
int maxNum = 0;
int res  = 0;
for(int m = 0;m<nums.size();m++){
int cur = nums.get(m);
if(map.containsKey(cur)){
newmap.put(cur, newmap.get(cur)==null?0:newmap.get(cur)+1);
if(newmap.get(cur)>maxNum){
res = cur;
maxNum = newmap.get(cur);
}
}
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: