hot100之堆
<blockquote><p>虽然更多用的是桶</p>
</blockquote>
<h3 id="数组中的第k个最大元素215">数组中的第k个最大元素(215)</h3>
<p><strong>桶排序</strong></p>
<pre><code class="language-java">class Solution {
public int findKthLargest(int[] nums, int k) {
int[] buckets = new int;
for (int i = 0; i < nums.length; i++){
buckets+10000]++;
}
for (int i = 20000; i >= 0; i--){
k -= buckets;
if (k <= 0){
return i - 10000;
}
}
return 0;
}
}
</code></pre>
<p><strong>选择排序</strong></p>
<pre><code class="language-java">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;
}
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p><strong>桶排序</strong></p>
<p><code>nums</code> 只有 10⁴, 便毅然决然的打表了 🤣 , 很坏啊击败了90%</p>
<p><strong>选择排序</strong></p>
<p>随机选择数组中的一个数作为中轴, 通过比较k落在中轴左端还是右端, 进一步缩小范围</p>
<h3 id="前k个高频元素">前k个高频元素</h3>
<pre><code class="language-java">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;
Arrays.setAll(freq_buckets, i -> new ArrayList<>());
for (Map.Entry<Integer, Integer> entry : num_buckets.entrySet){
freq_buckets.add(entry.getKey());
}
int[] res = new int;
int count = 0;
for (int i = max_nums; count < k && i >= 0; i--){
for (int num : freq_buckets) res = num;
}
return res;
}
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>以每个<整数>分桶, 再以<频率>对整数分桶</p>
<blockquote>
<p>选择 hash而不是 int[]→ 元素重复数量大</p>
</blockquote>
<h3 id="数据流的中位数295">数据流的中位数(295)</h3>
<pre><code class="language-java">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;
}
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>排序部分 - > <code>addNum</code>先在对端排序, 取出对端的 最小\最大 值</p>
<p>取中位数部分- > 当总数为奇数时, 以<code>lef.peek()</code>作为中位数, 需要保持 <code>lef.size() ≥ rig.size()</code></p><br><br>
来源:https://www.cnblogs.com/many-bucket/p/18939842
頁:
[1]