陣列中出現次數超過一半的數字
一、題解1
1. 思路:hash字典
- hash 字典統計數量,數量大於陣列長度一半時返回結果
2. 時間複雜度:O(n)
3. 空間複雜度:O(n)
二、題解2
1. 思路:排序
- 排序
- 排序後的中位數一定是的結果
2. 時間複雜度:O(nlogn)
3. 空間複雜度:O(logn) 排序遞迴棧空間
4. 實現
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
nums.sort((a, b) => a - b);
return nums[Math.floor(nums.length / 2)];
};
三、題解3
1. 思路:摩爾投票法(Boyer-Moore)
- 前提:目標數的數量大於陣列長度的一半
- 每一個目標數與其他如何非目標數抵消,最終剩下的一定是目標數
2. 步驟
補充
- 當votes變為0時,若上一輪假設的眾數是目標數,則其他數與目標數消耗的數量一致,剩下的數字中目標數數量依舊大於一半
- 若上一輪假設的眾不是目標數,則目標數消耗數量小於其他數,剩下的數字中目標數數量依舊大於一半
3. 時間複雜度:O(n)
4. 空間複雜度:O(1)
5. 實現
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
// 預處理(無)
// 摩爾投票法
let curr = nums[0], vote = 1;
for(let i=1, len=nums.length; i<len; i++){
if(vote === 0) curr = nums[i];
if(nums[i] === curr) vote++;
else vote--;
}
// 返回
return curr;
};
四、題解4
1. 思路:位運算
- 目標數數量大於陣列長度的一半,相應的,該目標數的二進位制數中,每一位(1 / 0)的數量也大於陣列長度的一半
相關文章
- 48 陣列中出現次數超過一半的數字陣列
- JZ-028-陣列中出現次數超過一半的數字陣列
- 每日一練(20):陣列中出現次數超過一半的數字陣列
- [劍指offer題解][Java]陣列中出現次數超過一半的數字Java陣列
- 力扣 - 劍指 Offer 39. 陣列中出現次數超過一半的數字力扣陣列
- 求出陣列中出現次數大於一半的數字陣列
- Leetcode 劍指 Offer 39. 陣列中出現次數超過一半的數字LeetCode陣列
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- 找到陣列中出現特定次數數字的問題陣列
- 陣列中出現兩次的數陣列
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 九度 1349 數字在排序陣列中出現的次數排序陣列
- JZ-037-數字在排序陣列中出現的次數排序陣列
- 《劍指offer》:[38]數字在排序陣列中出現的次數排序陣列
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- Matlab tabulate統計數字出現的次數,如果陣列中出現0Matlab陣列
- 劍指offer之列印超過陣列一半的數字陣列
- js找出陣列中出現最多的元素和次數JS陣列
- 統計陣列中各數字(元素)出現的次數陣列
- 計算陣列中每個數字出現的次數陣列
- 找出陣列中第 k 大的數字及其出現次數陣列
- 陣列-07. 求一批整數中出現最多的個位數字(20)陣列
- Matlab 統計陣列中各數字(元素)出現的次數Matlab陣列
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 找出陣列中只出現一次的數字陣列
- 給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。陣列
- asp.net 實現獲取一個集合陣列中出現次數最多的元素ASP.NET陣列
- 陣列中每個陣列元素出現的次數陣列
- 輸出字串中出現次數最多的字元和次數字串字元
- JZ-040-陣列中只出現一次的數字陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 《劍指offer》:[40]陣列中只出現一次的數字陣列
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 【劍指offer】陣列中只出現一次的數字(2)陣列
- 在其它數都出現k次的陣列中找到只出現一次的數陣列
- 陣列中重複的數字陣列