【问题标题】:How to deal with that kind of errors and why it occurred?(Memory Limit Exceeded)如何处理这种错误以及为什么会发生?(超出内存限制)
【发布时间】:2020-04-20 13:49:28
【问题描述】:

这是一个 leetcode 问题。 在eclipse中运行我的代码时一切都很好,但是当我将它提交给leetcode时发生错误“超出内存限制”。如何处理它。

给定由成对的出发和到达机场 [from, to] 表示的机票列表,按顺序重构行程。所有的票都属于一个从肯尼迪机场出发的人。因此,行程必须从肯尼迪机场开始。

注意:

如果有多个有效行程,您应该在读取为单个字符串时返回具有最小词汇顺序的行程。例如,行程 ["JFK", "LGA"] 的词汇顺序比 ["JFK", "LGB"] 小。 所有机场均由三个大写字母(IATA 代码)表示。 您可以假设所有机票至少包含一个有效行程。

这是我的解决方案:

class Solution {
    class Checker implements Comparator<String>{
        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2);
        }
    }
    public List<String> findItinerary(List<List<String>> tickets){
        String begin="JFK";
        final String example=begin;
        List<String> solution = new ArrayList<>();
        long counter=tickets.stream().filter(lister->lister.get(0).equals(example)).count();
        List<String> lexic=tickets.stream().filter(lister->lister.get(0).equals("JFK")).map(p->p.get(1)).distinct().collect(Collectors.toList());
        Comparator<String> comparator =new Checker();
        lexic.sort(comparator);
        solution.add(begin);
        begin=lexic.get(0);
        System.out.println(counter);
        for(int i=0;i<tickets.size();i++) {
            if(tickets.get(i).get(0).equals(begin)) {
                if(!solution.contains(begin)) {
                    solution.add(begin);
                }
                begin=tickets.get(i).get(1);
                solution.add(begin);
                i=-1;
            }
        }
        return solution;
    }

}

【问题讨论】:

  • lexic 列表看起来没有必要:只需使用 min 而不是收集到列表、排序和获取第一个元素。
  • @Andy Turner 我用它来根据词汇顺序得到最方便的路线
  • 你不会在begin=lexic.get(0); 行之后使用lexic,对吗?
  • @Andy Turner 不,我不使用它,但我需要词汇才能使用比较器对结果进行排序

标签: java algorithm arraylist data-structures


【解决方案1】:

这个问题是因为lexic.sort() 而发生的,Java 在堆上创建了一个额外的元素副本,所以现在你有两倍的内存来解决问题。为了解决它,您必须对有向循环图使用图遍历技术并根据词法排序做出决策,不需要lexic 或使用排序方法。

【讨论】:

    【解决方案2】:

    大多数提供编码环境的网站(即 Leetcode)都会对时间/内存施加特定限制,必须满足这些限制才能将解决方案视为“可接受”。因此,您的解决方案可能是正确的,但它使用的内存比预期的要多。

    在某种程度上,这意味着您的解决方案的空间复杂度不是最优的。请记住,java Stream API 会产生额外的内存开销,因此我建议您避免使用它们。

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2018-12-18
      • 2021-12-02
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2016-01-01
      • 2019-07-03
      相关资源
      最近更新 更多