剑指offer:数据流中的中位数

题目描述:

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

实现:

public class GetMedianNum {
    ListNode head=new ListNode(-1);
    ListNode m1=null;
    ListNode m2=null;
	public void Insert(Integer num) {
		boolean b=false;
		if(head.next==null){
			b=true;
		}
        ListNode in=new ListNode(num);
        ListNode p=head;
        while(p.next!=null && p.next.val<num){
        	p=p.next;
        }
        in.next=p.next;
        p.next=in;
        if(b){
        	m1=head.next;
        	m2=head.next;
        }
        else{
        	if(m1==m2){//两个指针指向同一个结点
        		if(num>m1.val){//num插入指针后面
        			m1=m1.next;
        		}
        		else{//num插入指针前面
        			ListNode t=head;
        			while(t.next!=null && t.next!=m2){
        				t=t.next;
        			}
        			m2=t;
        		}
        	}
        	else{//两个指针指向不同的结点
        		if(num>m1.val && num>m2.val){//插入两个指针后面
        			m2=m2.next;
        		}
        		else{
        			if(num>m2.val && num<m1.val){//插入两个指针中间
        				m1=in;
        				m2=in;
        			}
        			else{//插入两个指针前面
        				m1=m2;
        			}
        		}
        	}
        }
    }

    public Double GetMedian() {
        if(head.next==null) return null;
        if(m1==m2) return (double) m1.val;
        else return (double) (m1.val+m2.val)/2;
    }

}
public class ListNode {
	public int val;
	public ListNode next;
	public ListNode(int val){
		this.val=val;
		next=null;
	}
}

指针操作比较复杂,用一个链表保存输入的数据,插入时比顺序表好操作一点,指针m1和m2是指向中间的指针,以方便读取中位数,但是维护这两个指针有一点麻烦。

猜你喜欢

转载自blog.csdn.net/karute/article/details/80246654
今日推荐