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著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
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);
*/