题目:主元素 III


给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的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;    
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值