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 }
  • 相关阅读:
    反弹shell
    php-fpm(绕过open_basedir,结合ssrf)
    LNMP和LAMP的搭建
    linux常用命令 awk命令
    git 工作区管理
    linux常用命令 grep命令
    linux常用命令 print格式输出
    linux常用命令 cut字符截取命令
    linux常用命令 wc统计命令
    linux常用命令 sort排序命令
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4799807.html
Copyright © 2011-2022 走看看