给定一个int数组A,初始为空,现生成n个随机数依次传入数组中,将返回一个int数组,数组中的每个元素代表每次传入随机数到数组A后A中全部数的中位数。(若传入了偶数个数字则令中位数为第n/2小的数字,n为已传入数字个数)保证n小于等于1000。
测试样例:
[1,2,3,4,5,6],6
返回:[1,1,2,2,3,3]
class Middle { public: vector<int> getMiddle(vector<int> A, int n) { priority_queue<int, vector<int>, less<int>> small; priority_queue<int, vector<int>, greater<int>> big; vector<int> ans; for(int i = 0; i < A.size(); ++i){ if(small.empty() || A[i] <= small.top()) small.push(A[i]); else big.push(A[i]); if(small.size() == big.size()+2){ big.push(small.top()); small.pop(); } else if(small.size() == big.size()-1){ small.push(big.top()); big.pop(); } ans.push_back(small.top()); } return ans; } };
class Middle { public: vector<int> getMiddle(vector<int> A, int n) { //第奇数个数插入最小堆minheap,第偶数个数插入最大堆maxheap, //奇数个时中位数为minheap的堆顶元素,偶数个时中位数为maxheap的堆顶元素 //push_heap,pop_heap是STL提供的函数,最大/最小堆都存在vector中 //先处理前两个元素以及特殊情况 vector<int> res(n); if (n<1) return res; res[0] = A[0]; if (n == 1) return res; if (A[1] > A[0]) { maxheap.push_back(A[0]); minheap.push_back(A[1]); } else { maxheap.push_back(A[1]); minheap.push_back(A[0]); } res[1] = maxheap[0]; //依次插入到最大堆和最小堆 for (int i = 2; i<n; ++i) { int num = A[i]; if (i % 2)//第偶数个,插入最大堆maxheap { if (num >minheap[0]) { minheap.push_back(num); push_heap(minheap.begin(), minheap.end(), greater<int>()); num = minheap[0]; pop_heap(minheap.begin(), minheap.end(), greater<int>()); minheap.pop_back(); } maxheap.push_back(num); push_heap(maxheap.begin(), maxheap.end(), less<int>()); res[i] = maxheap[0]; } else//第奇数个,插入最小堆minheap { if (num <maxheap[0]) { maxheap.push_back(num); push_heap(maxheap.begin(), maxheap.end(), less<int>()); num = maxheap[0]; pop_heap(maxheap.begin(), maxheap.end(), less<int>()); maxheap.pop_back(); } minheap.push_back(num); push_heap(minheap.begin(), minheap.end(), greater<int>()); res[i] = minheap[0]; } } return res; } private: vector<int> minheap; vector<int> maxheap; };
//插入排序 维护前面部分有序 vector<int> getMiddle(vector<int> A, int n) { vector<int>ans; ans.push_back(A[0]); for(int i=1;i<n;++i){ int j; for(j=i-1;j>=0;--j){ if(A[i]>=A[j])break; } A.insert(A.begin()+j+1,A[i]); A.erase(A.begin()+i+1); ans.push_back(A[i/2]); } return ans; }
class Middle { public: vector<int> getMiddle(vector<int> A, int n) { // write code here vector<int> res; if(n<=0)return res; multiset<int> ms;//自动排序 for(int i=0;i<n;i++){ ms.insert(A[i]); auto it=ms.begin(); advance(it,i>>1);//前进合适距离 res.push_back(*it);//放入中位数 } return res; } };
class Middle { public: vector<int> getMiddle(vector<int> A, int n) { vector<int> res; priority_queue<int> mins; priority_queue<int,vector<int>,greater<int> > maxs; for(int i=0;i<n;i++){ if(mins.empty()||A[i]<=mins.top()) mins.push(A[i]); else maxs.push(A[i]); if(mins.size()-maxs.size()==2) maxs.push(mins.top()),mins.pop(); if(maxs.si***s.size()==1) mins.push(maxs.top()),maxs.pop(); res.push_back(mins.top()); } return res; } };
用最大最小堆维护 class Middle { public: vector<int> getMiddle(vector<int> A, int n) { if (n == 1) return vector<int>{A[0]}; priority_queue<int> maxHeap; priority_queue<int, vector<int>, greater<int>> minHeap; vector<int> res(n); res[0] = A[0]; res[1] = min(A[0], A[1]); maxHeap.emplace(min(A[0], A[1])); minHeap.emplace(max(A[0], A[1])); for (int i = 2; i < n; ++i) { if (A[i] >= minHeap.top()) minHeap.emplace(A[i]); else maxHeap.emplace(A[i]); if ((i & 1) == 1) { if (maxHeap.size() > minHeap.si敏感词Heap.emplace(maxHeap.top()); maxHeap.pop(); } else if (maxHeap.size() < minHeap.size()) { maxHeap.emplace(minHeap.top()); minHeap.pop(); } res[i] = maxHeap.top(); } else { if (maxHeap.size() + 1 > minHeap.si敏感词Heap.emplace(maxHeap.top()); maxHeap.pop(); } else if (maxHeap.size() + 1 < minHeap.size()) { maxHeap.emplace(minHeap.top()); minHeap.pop(); } res[i] = minHeap.top(); } } return res; } };
/* 建立最大最小堆,具体步骤如下: 1、最大堆中存放比最小堆中小的元素 2、如果最大堆中队头的元素大于最小堆的元素,则交换 3、i为奇数时存入最小堆,否则在最大堆中 */ import java.util.*; public class Middle { public int[] getMiddle(int[] A, int n) { // write code here if(A==null || n<1) return null; int[] res = new int[n]; Comparator<Integer> cmp = new Comparator<Integer>() { @Override public int compare(Integer i1,Integer i2) { return i2.compareTo(i1); } }; PriorityQueue<Integer> maxHeap = new PriorityQueue(n,cmp); PriorityQueue<Integer> minHeap = new PriorityQueue(n); for(int i=0;i<n;i++) { maxHeap.offer(A[i]); if(i%2==1) { minHeap.offer(maxHeap.poll()); //res[i] =(maxHeap.peek()+minHeap.peek())/2; } else{ if(!minHeap.isEmpty()){ if(maxHeap.peek()>minHeap.peek()) { Integer ma = maxHeap.poll(); Integer mi = minHeap.poll(); maxHeap.offer(mi); minHeap.offer(ma); } } } res[i] = maxHeap.peek(); } return res; } }
# -*- coding:utf-8 -*- import bisect class Middle: def getMiddle(self, A, n): mid,res,count=[],[],0 for i in A: bisect.insort(mid,i) count+=1 if count%2==0: res.append((mid[count//2-1])) else: res.append(mid[count//2]) return res
//插入排序 import java.util.*; public class Middle { public int[] getMiddle(int[] A, int n) { // write code here int[]res=new int[A.length]; res[0]=A[0]; for (int i = 1; i < A.length; i++) { int k=i-1; int tem=A[i]; while(k>=0&&A[k]>tem){ A[k+1]=A[k]; k--; } A[++k]=tem; res[i]=A[i/2]; } return res; } }
//和剑指offer 63题类似,借助了以前做的,用的最大堆最小堆。 class Middle { private: vector<int> min; vector<int> max; public: void Insert(int num) { //如果数据是偶数个 int min_si敏感词.size(); int max_size=max.size(); int total=min_size+max_size; if(total%2==0){ //如果数据是偶数个,最终要插入到最小堆 if(max_size>0&&num<max[0]){ //必须要数据元素大于0 max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); num=max[0]; pop_heap(max.begin(),max.end(),less<int>()); max.pop_back(); } min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); } else{ if(min_size>0&&num>min[0]){ min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); num=min[0]; pop_heap(min.begin(),min.end(),greater<int>()); min.pop_back(); } max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); } } int GetMedian() { int si敏感词.size()+max.size(); if(size==0) return -1; int median; if(size%2) median=min[0]; else median=max[0]; return median; } vector<int> getMiddle(vector<int> A, int n) { // write code here vector<int> result; if(n<=0) return result; for(int i=0;i<n;++i){ Insert(A[i]); result.push_back(GetMedian()); } return result; } };
import java.util.*; public class Middle { public int[] getMiddle(int[] A, int n) { // write code here int[] result = new int[A.length]; int count = 0; PriorityQueue<Integer> minHeap = new PriorityQueue<>(); PriorityQueue<Integer> maxHeap = new PriorityQueue<>((x, y) -> y - x); for (int i = 0; i < A.length; ++i) { if ((count & 1) == 0) { maxHeap.offer(A[i]); Integer filteredMaxNum = maxHeap.poll(); minHeap.offer(filteredMaxNum); } else { minHeap.offer(A[i]); Integer filteredMinNum = minHeap.poll(); maxHeap.offer(filteredMinNum); } result[i] = (count & 1) == 0 ? minHeap.peek() : maxHeap.peek(); count += 1; } return result; } }
import java.util.*; public class Middle { public int[] getMiddle(int[] A, int n) { // write code here int res[] = new int[n]; PriorityQueue<Integer> maxHeap = new PriorityQueue<>((u, v) -> v.compareTo(u)); PriorityQueue<Integer> minHeap = new PriorityQueue<>(); for (int i = 0; i < n; i++) { maxHeap.offer(A[i]); minHeap.offer(maxHeap.poll()); if (maxHeap.size() < minHeap.size()) { maxHeap.offer(minHeap.poll()); } res[i] = maxHeap.peek(); } return res; } }
class Middle { public: vector<int> getMiddle(vector<int> A, int n) { // write code here vector<int> ret; multiset<int> nums; multiset<int>::iterator itr; for (int i = 0; i < n; ++i) { if (nums.empty() ) { ret.push_back(A[i]); nums.insert(A[i]); } else { nums.insert(A[i]); int k = i / 2; itr = nums.begin(); while (k > 0) { --k; ++itr; } ret.push_back(*itr); } } return ret; } };
import java.util.*; public class Middle { public int[] getMiddle(int[] A, int n) { int[] res = new int[n]; PriorityQueue<Integer> max = new PriorityQueue<>((o1, o2) -> o2 - o1); PriorityQueue<Integer> min = new PriorityQueue<>(); max.add(A[0]); res[0] = A[0]; for (int i = 1; i < n; i++) { if (A[i] <= res[i - 1]) { max.add(A[i]); } else min.add(A[i]); if (min.size() > max.size()) { max.add(min.poll()); } if (max.size() - 1 > min.size()) { min.add(max.poll()); } res[i] = max.peek(); } return res; } }