給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。
例如,給定陣列 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。
注意:你可以假設給定的 k 總是合理的,1 ≤ k ≤ 陣列中不相同的元素的個數。
第一步基本都是一致的,需要統計出每個元素的出現次數 :先遍歷一遍陣列,以陣列的值做key存放到map中,初始value為1,當有相同的key時,把value加1,然後map中的value就是每個元素的出現次數了.
方式1:簡單暴力一點 , 然後對map中的value進行一次全排序,然後輸出前k個高頻的元素即可.
方式2:採用最小堆優化一下 , 構建乙個容量為k的最小堆 , 遍歷map中的value ,堆的數量小於k時新增 , 等於k之後,用新的value與堆中的最小值進行pk, 大於堆中的最小值就新增進堆,不大於就丟棄 , 遍歷完map之後,輸出堆中的元素就是前k大的元素了.
方式3:採用桶排序 , 構建n+1個桶, 每個桶裡放乙個陣列 , (為什麼是陣列?因為可能2出現了5次,3也出現了5次,所以5這個桶需要用陣列盛放) ,然後把value對應的key填入對應的桶中 , 前k個高頻元素就從桶的結束位置倒敘遍歷k個元素即可. 桶排序就是典型的空間換時間.
方式4:借用了快速排序的思想,我們要找出前k個元素,構建乙個從大到小的陣列, 在排序的過程中,如果能找到乙個基準值,前面的都比基準值大,這個基準值又是k,那麼就說明,前面的資料就是前k個高頻元素了.
全排序法:
public listtopkfrequent(int nums, int k)
// 對元素按照頻率進行降序排序
list> list = new arraylist<>(freqmap.entryset());
collections.sort(list, new comparator>()
});// 取出前k個元素
int count = 0;
listret = new arraylist<>();
for (map.entryentry : list)
}return ret;
}
最小堆法:
public listtopkfrequent(int nums, int k)
// 遍歷map,用最小堆儲存頻率最大的k個元素
priorityqueuepq = new priorityqueue<>(new comparator()
});for (integer key : map.keyset()) else if (map.get(key) > map.get(pq.peek()))
}// 取出最小堆中的元素
listret = new arraylist<>();
while (!pq.isempty())
return ret;
}
桶排序法
public listtopkfrequent(int nums, int k)
// 桶排序
list bucket = new list[nums.length + 1];
for (integer key : int2freqmap.keyset())
bucket[freq].add(key);
}// 逆序(頻次由高到低)取出元素
listret = new arraylist<>();
for (int i = nums.length; i >= 0 && ret.size() < k; --i) else }}
}return ret;
}
前 K 個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...
前k個高頻元素
給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...
前 K 個高頻元素
題目 給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。eg 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 eg 輸入 nums 1 k 1 輸出 1 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log n n...