牛客网 在线编程 数据流中的中位数
生活随笔
收集整理的這篇文章主要介紹了
牛客网 在线编程 数据流中的中位数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
如何得到一個數據流中的中位數?如果從數據流中讀出奇數個數值,那么中位數就是所有數值排序之后位于中間的數值。如果從數據流中讀出偶數個數值,那么中位數就是所有數值排序之后中間兩個數的平均值。我們使用Insert()方法讀取數據流,使用GetMedian()方法獲取當前讀取數據的中位數。
?
import java.util.*;public class Solution {public ArrayList<Integer> list = new ArrayList<>();public Solution() {// TODO Auto-generated constructor stub}public void Insert(Integer num) {int size = list.size();list.add(num);int index = bs(num);for (int i = size-1; i >= index; i--)swap(i+1, i);}public Double GetMedian() {int size = list.size() - 1;if (size % 2 == 1)return Double.valueOf((list.get(size / 2) + list.get(size / 2 + 1)) / 2.0);elsereturn Double.valueOf(list.get(size / 2));}public int bs(int val) {int l = 0;int r = list.size() - 1;int mid = 0;while (l <= r) {mid = (l + r) >> 1;if (list.get(mid) <= val) {l = mid + 1;} else {r = mid - 1;}}return l;}public void swap(int i, int j) {int tmp = list.get(i);list.set(i, list.get(j));list.set(j, tmp);}}用插入排序重新排序。這種做法比較垃圾。重新寫了一個用優先級隊列的方法。一個大根堆和一個小根堆
import java.util.*;public class Solution {public PriorityQueue<Integer> maxHeap;public PriorityQueue<Integer> minHeap;public Solution() {maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});minHeap = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}});}public void Insert(Integer num) {if (this.maxHeap.isEmpty() || num <= this.maxHeap.peek()) {this.maxHeap.add(num);} else {this.minHeap.add(num);}while (Math.abs(this.maxHeap.size() - this.minHeap.size()) > 1) {if (this.maxHeap.size() > this.minHeap.size()) {this.minHeap.add(this.maxHeap.poll());} else {this.maxHeap.add(this.minHeap.poll());}}}public Double GetMedian() {int maxsize = this.maxHeap.size();int minsize = this.minHeap.size();if ((minsize + maxsize) % 2 == 0) {return Double.valueOf((this.maxHeap.peek() + this.minHeap.peek()) / 2.0);} else {if (maxsize > minsize) {return Double.valueOf(this.maxHeap.peek());} else {return Double.valueOf(this.minHeap.peek());}}}}?
總結
以上是生活随笔為你收集整理的牛客网 在线编程 数据流中的中位数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网 在线编程 回文链表
- 下一篇: 十种排序算法的java汇总