題目連接java
很直接,代碼略
因爲題目的follow-up要求空間複雜度O(1),因此,這個方法其實並非最優解。c++
一次刪除兩個不一樣的數,若是存在majority element,那麼這個majority element必定會最後剩下來,可是,不能說一次刪除兩個不一樣的數,最後剩下了來的數就是majority element,好比{1,2,3,4,5} 這個數組,最後剩下5,5不是要求的值。因此,在執行完每次刪除兩個不一樣的數這個操做後,最後留下的數,還要過一遍數組,看下這個數是否是超過了半數,若是超過半數,纔算是最後結果。代碼見:git
public static int majorityElement(int[] nums) { if (nums == null || nums.length == 0) { return -1; } if (nums.length == 1) { return nums[0]; } int cand = nums[0]; int HP = 1; int i = 1; int limit = nums.length >> 1; while (i < nums.length) { if (cand == nums[i]) { HP++; // 若是某時,HP已經大於一半的數了,直接返回 if (HP > limit) { return nums[i]; } } else { if (HP == 0) { cand = nums[i]; HP++; } else { HP--; } } i++; } if (HP == 0) { return -1; } int c = 0; for (int num : nums) { if (cand == num) { c++; } } if (c > limit) { return cand; } else { return -1; } }
說明:
其中HP標識候選數出現的次數,咱們能夠假設侯選數一開始就是num[0],只要遍歷到的數和候選數一致,HP++,不一致,直接HP歸零,侯選數置爲當前數,這樣就實現了一次刪除兩個數的目的。
此外,這裏有一個小的貪心,就是當HP已經到達數組一半以上的大小時候,直接返回當前的候選數(由於HP就表示侯選數出現的次數)程序員
算法和數據結構筆記github