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.

翻譯

給予一個 n 大小的陣列,找出眾數,眾數的數量一定超過陣列長度一半。

你要假設陣列是一個非空且一定有眾數存在。

解法

Java

Solution 1.

第一種方法是使用 Map 方式 key 儲存數字 value 儲存出現次數。

  • 進位轉換
  • Run Time: 51 ms
  • 時間複雜度: O(n)
  • 空間複雜度: O(n)
class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> map= new HashMap<>();
            int max=Integer.MIN_VALUE,ans=0;
            for(int i=0;i<nums.length;i++) {
                if(map.containsKey(nums[i])) {
                    map.put(nums[i], map.get(nums[i])+1);
                }else {
                    map.put(nums[i], 1);
                }
                if(map.get(nums[i])>max) {
                    ans=nums[i];
                    max=map.get(nums[i]);
                }
            }
            return ans;
    }
}
Solution 2.

第二種方法是先用內建排序後再依序找出數量最多的數字。

  • 進位轉換
  • Run Time: 6 ms
  • 時間複雜度: O(nlogn)
  • 空間複雜度: O(1)
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        int max = Integer.MIN_VALUE, count = 1, ans = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i - 1]) {
                count++;
            } else {
                count = 1;
            }
            if (max < count) {
                max = count;
                ans = nums[i - 1];
            }
        }
        return ans;
    }
}
Solution 3.

仔細看懂題目發現題目有敘述到,重複的數字一定會占半數以上,所以排序後直接取中位數就可以了。

  • 進位轉換
  • Run Time: 3 ms
  • 時間複雜度: O(nlogn)
  • 空間複雜度: O(1)
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

C

Solution 1.

此方法不需用到排序,前提是最大重複數字一定佔總數過半。

  • 進位轉換
  • Run Time: 6 ms
  • 時間複雜度: O(n)
  • 空間複雜度: O(1)
int majorityElement(int * nums, int numsSize) {
  int num = 0, count = 0, i = 0;
  for (i = 0; i < numsSize; i++) {
    if (count == 0)
      num = nums[i];
    if (nums[i] == num)
      count++;
    else
      count--;
  }
  return num;
}

results matching ""

    No results matching ""