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 }
  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4799807.html
Copyright © 2011-2022 走看看