leetcode 703. データストリームのK番目の要素


データストリームのK番目の大きな要素を見つけるクラス(class)を設計します.注意は、ソート後のK番目の大きな要素であり、K番目の異なる要素ではありません.
KthLargestクラスには、データストリームの初期要素を含む整数kと整数配列numsを同時に受信するコンストラクタが必要です.KthLargestを呼び出すたびにaddは、現在のデータストリームのK番目に大きい要素を返します.
例:
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3);   //returns 4 kthLargest.add(5);   //returns 5 kthLargest.add(10);  //returns 5 kthLargest.add(9);   //returns 8 kthLargest.add(4);//returns 8説明:numsの長さ≧k-1、k≧1を仮定できます.
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/kth-largest-element-in-a-stream著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
class KthLargest {
    /**
     * @param Integer $k
     * @param Integer[] $nums
     */
    function __construct($k, $nums) {
        $this->k = $k;
        $this->nums = [];
        foreach($nums as $key => $value){
            $this->add($value);
        }
    }
  
    /**
     * @param Integer $val
     * @return Integer
     */
    function add($val) {
       
        $count = count($this->nums);
        $half = $count>>1;
        if(count($this->nums) k){
            $this->nums[] = $val;
            if($count != 0){
                $this->nums = $this->siftUp($count,$this->nums);
            }
            
        }elseif($val>$this->nums[0]){
            $this->nums[0] = $val;
            $this->nums = $this->siftDonw(0,$half,$this->nums);
        }

        return $this->nums[0];
    }

    //         
    function siftDonw($index,$half,$data){
        $element = $data[$index];
        while($index$data[$rchildIndex]){
                $childIndex = $rchildIndex;
            }
            if($element < $data[$childIndex]){
                break;
            }
            $data[$index] = $data[$childIndex];
            $index = $childIndex;
        }
        $data[$index] = $element;
        return $data;
    }
    //         
    function siftUp($index,$data){
        $element = $data[$index];
        while($index > 0){
            $pIndex = ($index-1)>>1;
            $parent = $data[$pIndex];
            if($element > $parent){
                break;
            }
            $data[$index] = $parent;
            $index = $pIndex;
        }
        $data[$index] = $element;
        return $data;
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * $obj = KthLargest($k, $nums);
 * $ret_1 = $obj->add($val);
 */