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 }

 

posted @ 2015-09-11 03:07  树獭君  阅读(155)  评论(0编辑  收藏  举报