【问题标题】:Find max nested list count查找最大嵌套列表计数
【发布时间】:2017-12-09 21:50:37
【问题描述】:

我有一个名为 Person 的类对象

public class Person {
    ....
    private List<Person> people;
    ....
    public List<Person> getPeople() {
          return people;
    }

    public void setPeople(List<Person> people) {
          this.people = people;
    }

每个人都有内部所有员工的列表,每个人都有下面的人员列表。如何找到最大深度?例如,在该图像中,最大深度为 2。第二高的是 1。任何帮助表示赞赏。

【问题讨论】:

  • 你确定你的图中没有循环吗?这意味着 person.people 或其孩子之一不引用 person?
  • 是的。我很确定

标签: java oop collections java-8


【解决方案1】:

简单地说:

public static int maxDepth(Person p) {
    int maxChildrenDepth = 0;
    for (Person c: p.getPeople()) {
        maxChildrenDepth = Math.max(maxChildrenDepth, maxDepth(c));
    }
    return 1 + maxChildrenDepth;
}

【讨论】:

  • 它返回 4 而不是 3。我将 maxDepth 的值减去 1。你能告诉我更正吗?
【解决方案2】:

实际上原始答案是 1+,因为我每次都必须减去负 1。这是正确答案

public int maxDepth() {
        int maxChildrenDepth = 0;

        if(people.size()==0)
            return 0;

        for (Person prs: people) {
            maxChildrenDepth = Math.max(maxChildrenDepth, prs.maxDepth());
        }

        return 1 + maxChildrenDepth;
    }

【讨论】:

    【解决方案3】:

    尝试使用深度优先搜索。它专门首先找到最深的节点。

    1  procedure DFS(G,v):
    2      label v as discovered
    3      for all edges from v to w in G.adjacentEdges(v) do
    4          if vertex w is not labeled as discovered then
    5              recursively call DFS(G,w)
    

    查看this,了解更多信息。

    【讨论】:

      【解决方案4】:

      我认为一种方法(这种方法可能不是最有效也不是最好的方法)可能是创建一个 while 循环,该方法的递归调用检查 getPeople( 是否返回 null。如果没有,那么您可以增加计数器并再次递归调用该检查方法。当getPeople() 返回null 并返回分配给计数器的值时,此方法应该中断。

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多