处理 TreeSet 中的重复项

我正在解决一个问题,我们必须找到每个窗口(滑动窗口)的中位数。我知道树集不允许重复。因此,我编写了一个自定义比较器来使用元素索引而不是值。


下面是代码:-


class Solution {


     static int a[];

     static TreeSet<Integer> minheap;

     static TreeSet<Integer> maxheap;


     static class comp implements Comparator<Integer>

     {

         public int compare(Integer x,Integer y)

         {

             if(a[x]<a[y]) return -1;

             if(a[x]>a[y]) return 1;

             return 1;

         }

     }


    static class comp1 implements Comparator<Integer>

     {

         public int compare(Integer x,Integer y)

         {

             if(a[x]>a[y]) return -1;

             if(a[x]<a[y]) return 1;

             return 1;

         }

     }


     public void balance()

     {

         if(maxheap.size()>minheap.size()+1)

         {

             int temp=maxheap.pollFirst();

             minheap.add(temp);

         }

     }


     public void addNum(int num) {

        maxheap.add(num);

        balance();

        if(!maxheap.isEmpty() && !minheap.isEmpty() && a[maxheap.first()]>a[minheap.first()])

        {

            int temp1=minheap.pollFirst();

            int temp2=maxheap.pollFirst();


            minheap.add(temp2);

            maxheap.add(temp1);

        }

    }


    public double findMedian() {

        int size=maxheap.size()+minheap.size();

        if(size%2==1) return a[maxheap.first()];

        else return ((double)a[maxheap.first()] + a[minheap.first()])/2;

    }


    public double[] medianSlidingWindow(int[] nums, int k) {

        minheap=new TreeSet<Integer>(new comp());

        maxheap=new TreeSet<Integer>(new comp1());


        a=new int[nums.length];

        for(int i=0;i<nums.length;i++)

            a[i]=nums[i];


        double ans[]=new double[nums.length-k+1];


        int j=0;


        for(int i=0;i<k;i++)

            addNum(i);

在两个比较器中,当两个值相同时我返回 1 以打破联系,否则,如果我返回 0,treeset 会将它们视为相同。如果我使用该语句,则行为会很奇怪。但是,如果我在两个值相等时将“return 1”替换为“return yx”,则效果很好。


有人可以帮助我理解这种行为吗?


皈依舞
浏览 157回答 1
1回答

HUH函数

您的语句破坏了's方法return 1;的约定,因为这意味着 if&nbsp;,&nbsp;will return并且也将 return&nbsp;,并且违反了要求。Comparatorcomparea[x]==a[y]compare(x,y)1compare(y,x)1sgn(compare(x, y)) ==-sgn(compare(y, x))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java