相关疑难解决方法(0)

存储来自数字流的最大5000个数字

鉴于以下问题:

"从数字流中存储最大的5000个数字"

我们想到的解决方案是二进制搜索树,它保持树中节点数量的计数,以及一旦计数达到5000就对最小节点的引用.当计数达到5000时,可以将每个要添加的新数字进行比较树中最小的项目.如果更大,则可以添加新数字,然后移除最小的数字并计算新的最小数量(这应该非常简单,已经具有前一个最小值).

我对这个解决方案的关注是二叉树自然会出现偏差(因为我只是在一边删除).

有没有办法解决这个问题,不会造成一个非常歪斜的树?

如果有人想要它,我已经为我的解决方案包括伪代码到目前为止:

process(number)
{
  if (count == 5000 && number > smallest.Value)
  {
    addNode( root, number)
    smallest = deleteNodeAndGetNewSmallest ( root, smallest)
  }
}

deleteNodeAndGetNewSmallest( lastSmallest)
{
  if ( lastSmallest has parent)
  {
    if ( lastSmallest has right child)
    {
      smallest = getMin(lastSmallest.right)
      lastSmallest.parent.right = lastSmallest.right
    }
    else
    {
      smallest = lastSmallest.parent
    }
  }
  else 
  {
    smallest = getMin(lastSmallest.right)
    root = lastSmallest.right
  }
  count--
  return smallest
}

getMin( node)
{
  if (node has left)
    return getMin(node.left) …
Run Code Online (Sandbox Code Playgroud)

algorithm binary-search-tree

11
推荐指数
1
解决办法
3902
查看次数

找到距离原点最近的K点(0,0)

问题是,给定坐标列表,确定最接近原点的k坐标的数量.

我已经能够确定点和原点之间的距离,但是当过滤最近的k点时,我迷路了.我决定将这个逻辑放在第二个for循环中,对距离最近到最远的数组进行排序,然后推送小于K的值.

function kClosest(points, k) {
    let length = [];
    let arr = [];
    let result = [];
    let a = 0;
    let b = 0;

    for (let i = 0; i < points.length; i++) {
        a = points[i][0]; //x coord
        b = points[i][1]; //y coord (y will always be second number or '1')
        length.push(parseFloat(calcHypotenuse(a, b).toFixed(4)))
        arr.push([points[i], length[i]])
    }

    function calcHypotenuse(a, b) {
        return (Math.sqrt((a * a) + (b * b)));
    }

    for (let i = 0; i < k; …
Run Code Online (Sandbox Code Playgroud)

javascript arrays algorithm loops return

6
推荐指数
2
解决办法
547
查看次数