首页 > 基础资料 博客日记
hot100之堆
2025-06-21 12:30:03基础资料围观10次
文章hot100之堆分享给大家,欢迎收藏Java资料网,专注分享技术知识
虽然更多用的是桶
数组中的第k个最大元素(215)
桶排序
class Solution {
public int findKthLargest(int[] nums, int k) {
int[] buckets = new int[200001];
for (int i = 0; i < nums.length; i++){
buckets[nums[i]+10000]++;
}
for (int i = 20000; i >= 0; i--){
k -= buckets[i];
if (k <= 0){
return i - 10000;
}
}
return 0;
}
}
选择排序
class Solution {
public int findKthLargest(int[] nums, int k) {
List<Integer> numList = new ArrayList<>();
for (int num : nums){
numList.add(num);
}
return quickSelect(numList, k);
}
private int quickSelect(List<Integer> nums, int k){
Random rand = new Random();
int midd = nums.get(rand.nextInt(nums.size()));
List<Integer> big = new ArrayList<>();
List<Integer> sma = new ArrayList<>();
for (int num : nums){
if (num > midd){
big.add(num);
}
else if (num < midd){
sma.add(num);
}
}
if (k <= big.size()) return quickSelect(big, k);
else if (nums.size() < k + sma.size()) return quickSelect(sma, k + sma.size() - nums.size());
return midd;
}
}
- 分析
桶排序
nums[i]
只有 10⁴, 便毅然决然的打表了 🤣 , 很坏啊击败了90%
选择排序
随机选择数组中的一个数作为中轴, 通过比较k落在中轴左端还是右端, 进一步缩小范围
前k个高频元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int n = nums.length;
Map<Integer, Integer> num_buckets = new HashMap<>();
for (int num : nums){
num_buckets.merge(num, 1, Integer::sum);
}
int max_nums = Collections.max(num_buckets.values());
List<Integer>[] freq_buckets = new ArrayList[max_nums+1];
Arrays.setAll(freq_buckets, i -> new ArrayList<>());
for (Map.Entry<Integer, Integer> entry : num_buckets.entrySet){
freq_buckets[entry.getValue()].add(entry.getKey());
}
int[] res = new int[k];
int count = 0;
for (int i = max_nums; count < k && i >= 0; i--){
for (int num : freq_buckets[i]) res[count++] = num;
}
return res;
}
}
- 分析
以每个<整数>分桶, 再以<频率>对整数分桶
选择 hash而不是 int[] → 元素重复数量大
数据流的中位数(295)
class MedianFinder {
private PriorityQueue<Integer> lef = new PriorityQueue<>((a,b) -> b-a); //大堆
private PriorityQueue<Integer> rig = new PriorityQueue<>(); //小堆
public MedianFinder() {
}
public void addNum(int num) {
if(lef.size() == rig.size()){
rig.offer(num);
lef.offer(rig.poll());
}else{
lef.offer(num);
rig.offer(lef.poll());
}
}
public double findMedian() {
if (lef.size() != rig.size()){
return lef.peek();
}
return (lef.peek() + rig.peek()) / 2.0;
}
}
- 分析
排序部分 - > addNum
先在对端排序, 取出对端的 最小\最大 值
取中位数部分- > 当总数为奇数时, 以lef.peek()
作为中位数, 需要保持 lef.size() ≥ rig.size()
文章来源:https://www.cnblogs.com/many-bucket/p/18939842
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:Spring MVC详解
下一篇:没有了