20200309
题目:数据流中的中位数
如何得到一个数据流中的中位数,如果从数据流中读出奇数个数值,那么中位数就是所有数值排序后位于中间的数值。如果是偶数,就是中间两个数的平均值。
思路 :将输入的数分成两部分
lowPart
:利用最大堆维护这一部分,可以比highPart
多1;highPart
:利用最小堆进行维护;- 如果
size
为奇数,那么中位数就是lowPart
的堆顶。否则就是lowPart
和hightPart
堆顶的平均值。 - 每进入一个数,下加入
lowPart
,然后将lowPart
的堆顶移到hightPart
。如果这时size
是奇数,此时highPart
将最小值移出至lowPart
。
code
class MedianFinder{
PriorityQueue<Integer> lowPart;
PriorityQueue<Integer> highPart;
int size = 0;
public MedianFinder(){
lowPart = new PriorityQueue<Integer>((x,y) -> y-x);//最大堆
highPart = new PriorityQueue<Integer>();
size = 0;
}
public void addNum(int num){
size++;
lowPart.offer(num);//先插入到最大堆
highPart.offer(lowPart.poll());//再插入到最小堆。
if((size & 1) == 1){//当时奇数时,保证中值在lowpart中。
lowPart.offer(highPart.poll());
}
}
public double findMedian(){
if((size & 1) == 1){
return (double)lowPart.peek();
}else{
return (double)(lowPart.peek() + highPart.peek()) / 2;
}
}
}
题目 : 连续子数组的最大和
输入一个整形数组,数组里有正数也有负数。数组中的一个或者连续多个整数构成一个子数组。求所有子数组的和的最大值。
思路 :动态规划
code
public class Solution{
public static int maxSubArray(int[] nums){
int max = nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i-1] > 0){
nums[i] += nums[i-1];
}
if(nums[i] > max)
max = nums[i];
}
}
return max;
}