【问题标题】:Find the smallest non-negative integer not contained in a binary tree找到不包含在二叉树中的最小非负整数
【发布时间】:2017-01-20 10:20:44
【问题描述】:

该方法返回二叉树中不包含的最小非负整数。

例子:

用 0 1 2 3 返回 4。

1 2 3 4 返回 0。

用 0 1 2 5 6 返回 3。

用 6 1 5 2 返回 3。

我的解决方案的复杂性是 O(n^2)。如何在不超过 O(n) 的时间内解决?

public static <E> int minIntNotContains(BinTree<Nodo<Integer>> node) {
    List<Integer> a=new ArrayList<Integer>();
    int min=minIntNotContainsRic(node,a);
    return min;
}

public static <E> int minIntNotContainsRic(BinTree<Nodo<Integer>> node,List<Integer> a) {
    int min= node.getValue().getValue();
    a.add(node.getValue().getValue());
    if(node.getLeftSubtree() != null) {
        min = Math.min(min, minIntNotContainsRic(node.getLeftSubtree(),a));
    }
    if(node.getRightSubtree() != null) {
        min = Math.min(min, minIntNotContainsRic(node.getRightSubtree(),a));
    }
    if (min>0) return 0;  
    else{
        for (int i=0;i<a.size();i++){
            if (!a.contains(i+1)){
                return i+1;
            }
        }
        return min;
    }           
}

【问题讨论】:

  • 为什么1 2 5 6不返回0?
  • 你怎么知道这是 O(n^2)?为什么需要在每个递归调用中循环遍历列表?
  • 是不是特殊的二叉树,比如搜索树?或者只是任何二叉树?
  • 0 非负数。如果你的意思是积极的,为什么1 2 3 4 返回 0?如果 0 表示“不丢失整数”,为什么0 1 2 3 返回 4?
  • 那么答案是 theta(N) 表示空间和时间复杂度,因为您总是需要遍历整棵树,因为对于较低级别(您对较低级别的值或树的任何部分一无所知)

标签: java algorithm time-complexity binary-tree


【解决方案1】:

您应该能够通过遍历树以 O(n) 计算树中的元素数。将此值称为x

如果索引值出现在树中,则使用 true 填充大小为 x 的布尔数组,否则通过遍历树填充 false (即 bool[y] == true iff y 出现在树中)。忽略 y &lt; 0y &gt;= x 所在树中的所有值 y

树中不存在的最小非负整数要么是布尔数组第一个为假的元素的索引,要么是x,如果所有元素都为真。

换一种说法,对于任何大小为x 的容器:

  1. 其中一个数字0..x-1 不包含在树中;或
  2. 所有数字0..x-1 都包含在树中,在这种情况下,树中未包含的最小非负数是x

【讨论】:

  • 这是很多不必要的工作(再次:一次遍历足以收集最低的非负数)。我也对这种方法感到困惑:if the index value appears in the tree?这是否意味着您需要一个大小 = max(value-in-tree) 的布尔数组?如果存在 1e10 值,这将炸毁内存。
  • 数组只需要和树中的元素个数一样大小,与cmets中O(n)的空间要求一致。有兴趣了解如何一次性完成此操作。
【解决方案2】:

假设二叉树遵循所有左边的孩子都小于他们的父母并且所有右边的孩子都大于他们的父母,你可以使用树的这个属性来减少你需要搜索的数量。

编辑:由于您的树是通用的,我的直接想法是执行 O(n) 排序,也许是计数排序。然后遍历以找到丢失的最小 int。总复杂度 O(2n)

【讨论】:

  • 如果更新当前候选值就足够了,为什么要排序?这是很多不必要的工作!
猜你喜欢
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2015-06-05
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多