剑指offer-20200309

20200309

题目:数据流中的中位数

如何得到一个数据流中的中位数,如果从数据流中读出奇数个数值,那么中位数就是所有数值排序后位于中间的数值。如果是偶数,就是中间两个数的平均值。

思路 :将输入的数分成两部分

  • lowPart:利用最大堆维护这一部分,可以比highPart多1;
  • highPart:利用最小堆进行维护;
  • 如果size为奇数,那么中位数就是lowPart的堆顶。否则就是lowParthightPart堆顶的平均值。
  • 每进入一个数,下加入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;
}
发布了94 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31900497/article/details/104747831