zoukankan      html  css  js  c++  java
  • Majority Element 解答

    Solution 1

    Naive way

    First, sort the array using Arrays.sort in Java. Than, scan once to find the majority element. Time complexity O(nlog(n))

     1 public class Solution {
     2     public int majorityElement(int[] nums) {
     3         int length = nums.length;
     4         if (length == 1)
     5             return nums[0];
     6         Arrays.sort(nums);
     7         int prev = nums[0];
     8         int count = 1;
     9         for (int i = 1; i < length; i++) {
    10             if (nums[i] == prev) {
    11                 count++;
    12                 if (count > length / 2) return nums[i];
    13             } else {
    14                 prev = nums[i];
    15                 count = 1;
    16             }
    17         }
    18         return 0;
    19     }
    20 }

    Solution 2

    Since the majority always take more than a half space, the middle element is guaranteed to be the majority. 

    1 public class Solution {
    2     public int majorityElement(int[] nums) {
    3         int length = nums.length;
    4         if (length == 1)
    5             return nums[0];
    6         Arrays.sort(nums);
    7         return nums[length / 2];
    8     }
    9 }

    Solution 3 Moore voting algorithm

    As we iterate the array, we look at the current element x:

    1. If the counter is 0, we set the current candidate to x and the counter to 1.
    2. If the counter is not 0, we increment or decrement the counter based on whether x is the current candidate.

    After one pass, the current candidate is the majority element. Runtime complexity = O(n).

     1 public class Solution {
     2     public int majorityElement(int[] nums) {
     3         int length = nums.length;
     4         if (length == 1)
     5             return nums[0];
     6         int maj = nums[0];
     7         int count = 0;
     8         for (int i = 0; i < length; i++) {
     9             if (count == 0) {
    10                 maj = nums[i];
    11                 count = 1;
    12             } else if (nums[i] == maj) {
    13                 count++;
    14             } else {
    15                 count--;
    16             }
    17         }
    18         return maj;
    19     }
    20 }

    Solution 4 Bit Manipulation

    We would need 32 iterations, each calculating the number of 1's for the ith bit of all n numbers. Since a majority must exist, therefore, either count of 1's > count of 0's or vice versa (but can never be equal). The majority number’s ith bit must be the one bit that has the greater count.

    Time complexity: 32 * n = T(n)

     1 public class Solution {
     2     public int majorityElement(int[] nums) {
     3         int length = nums.length;
     4         if (length == 1)
     5             return nums[0];
     6         int[] dig = new int[32];
     7         for (int i = 0; i < length; i++) {
     8             int tmp = nums[i];
     9             for (int j = 0; j < 32; j++) {
    10                 dig[j] += tmp & 1;
    11                 tmp = tmp >> 1;
    12             }
    13         }
    14         int max = 0;
    15         int tmp = 1;
    16         for (int i = 0; i < 32; i++) {
    17             if (dig[i] > length / 2) {
    18                 max = max | tmp;
    19             }
    20             tmp = tmp << 1;
    21         }
    22         return max;
    23     }
    24 }
  • 相关阅读:
    人人开源框架学习笔记
    Gitea安装笔记
    使用sdk方式获取微信的用户信息
    重写java类的equals()和hashCode方法
    Mysql 实现分页功能
    位运算应用和解析
    java代码POST方式请求SOAP
    java实现文件拷贝
    动态创建线程(多线程)处理大量数据
    ActiveMQ监听者接收信息
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4799807.html
Copyright © 2011-2022 走看看