leetcode (Majority Element)
阿新 • • 發佈:2018-11-24
Title: Majority Element 169
Difficulty:Easy
原題leetcode地址:https://leetcode.com/problems/majority-element/
1. 採用HashMap,時間&空間複雜度如下:
時間複雜度:O(n),一層for迴圈遍歷,最長遍歷整個陣列的長度。
空間複雜度:O(n),申請了一個HashMap,最長HashMap中需要儲存n個key-value。
/** * 採用HashMap * @param nums * @return */ public static int majorityElement(int[] nums) { if (nums == null || nums.length <= 0) { return 0; } int result = 0; Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i< nums.length; i++) { result = nums[i]; if (map.containsKey(nums[i])) { int value = map.get(nums[i]) + 1; map.put(nums[i], value); if (value > nums.length / 2) { break; } } else { map.put(nums[i], 1); } } return result; }
2. 採用 Moore voting algorithm(摩爾投票演算法)
摩爾投票演算法的基本思想:演算法在區域性變數中定義一個序列元素(m)和一個計數器(i),初始化的情況下計數器為0. 演算法依次掃描序列中的元素,當處理元素x的時候,如果計數器為0,那麼將x賦值給m,然後將計數器(i)設定為1,如果計數器不為0,那麼將序列元素m和x比較,如果相等,那麼計數器加1,如果不等,那麼計數器減1。處理之後,最後儲存的序列元素(m),就是這個序列中最多的元素。
時間複雜度:O(n),一層for迴圈遍歷,遍歷整個陣列的長度。
空間複雜度:O(1),沒有額外空間的申請。
/** * Moore voting algorithm * 每找出兩個不同的element,就成對刪除即count--,如果相同就count++ * @param nums * @return */ public static int majorityElement1(int[] nums) { if (nums == null || nums.length <= 0) { return 0; } int count = 0; int element = 0; for (int i = 0; i < nums.length; i++) { if (count == 0) { element = nums[i]; count = 1; } else { if (element == nums[i]) { count++; if (count >= nums.length / 2 + 1) { break; } } else { count--; } } } return element; }