169. Majority Element && 229. Majority Element II

169. Majority Element

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array. 

Hide Similar Problems
  (M) Majority Element II
 
 
public class Solution {
  public int majorityElement(int[] num) {
    int major = num[0];
    int count = 1;
    //The majority number has enough counts to cover all other numbers
    for (int i = 1; i < num.length; ++i) {
      if (count == 0) {
        ++count;
        major = num[i];
      } else if (major == num[i]) {
        ++count;
      } else
        --count;
    }
    return major;
  }
}

 

 

229. Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

Hint:

  1. How many majority elements could it possibly have?
  2. Do you have a better hint? Suggest it!

Hide Tags

  Array
Hide Similar Problems
  (E) Majority Element
public class Solution {
  public List<Integer> majorityElement(int[] nums) {
    List<Integer> results = new ArrayList<>();
    if (nums == null || nums.length == 0)
      return results;

    int n1 = nums[0];
    int n2 = nums[0];
    int count1 = 0;  //count keeps a "relative" count of current number
    int count2 = 0;
    int len = nums.length;

    for (int i = 0; i < len; ++i) {
      if (nums[i] == n1)
        ++count1;
      else if (nums[i] == n2)
        ++count2;
      else if (count1 == 0) {
        n1 = nums[i];
        count1 = 1;
      } else if (count2 == 0) {
        n2 = nums[i];
        count2 = 1;
      } else {
        //Zeros were check beforehand to make sure counts won't go negative
        --count1; 
        --count2;
      }
    }

    count1 = 0;
    count2 = 0;
    for (int i = 0; i < len; i++) {
      if (nums[i] == n1)
        ++count1;
      else if (nums[i] == n2)
        ++count2;
    }
    if (count1 > len / 3)
      results.add(n1);
    if (count2 > len / 3)
      results.add(n2);
    return results;
  }
}

the general solution by setting a different K

public class Solution {
  public List<Integer> majorityElement(int[] nums) {
    List<Integer> results = new ArrayList<>();
    if (nums == null || nums.length == 0)
      return results;

    int k = 2;
    Map<Integer, Integer> countMap = new HashMap<>();

    for (int n : nums) {
      Integer c = countMap.get(n);
      if (c == null) {
        if (countMap.size() < k) {
          countMap.put(n, 1);
        } else {
          List<Integer> toRemove = new ArrayList<>();
          for (Map.Entry<Integer, Integer> kvp : countMap.entrySet()) {
            Integer count = kvp.getValue();
            if (count == 1) {
              toRemove.add(kvp.getKey());
            } else {
              kvp.setValue(count - 1);
            }
          }
          for (Integer r : toRemove) {
            countMap.remove(r);
          }
        }
      } else {
        countMap.put(n, c + 1);
      }
    }

    for (Map.Entry<Integer, Integer> kvp : countMap.entrySet()) {
      kvp.setValue(0);
    }
    for (int n : nums) {
      Integer c = countMap.get(n);
      if (c != null)
        countMap.put(n, c + 1);
    }
    for (Map.Entry<Integer, Integer> kvp : countMap.entrySet()) {
      if (kvp.getValue() > nums.length / (k + 1)) {
        results.add(kvp.getKey());
      }
    }
    return results;
  }
}

 

 
 

转载于:https://www.cnblogs.com/neweracoding/p/5702180.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值