LeetCode 的 Java 题目,同样的数据,本地能过测试但是在线过不了

2022-06-19 20:15:42 +08:00
 movq

题目:

https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/

就是一个二叉搜索树,两个节点 p 和 q 找到最近公共祖先。这个树最大节点数目是 100000(虽然题目没说,但是我在美国 leetcode 里面找到了说明,而且在美国 leetcode 和这里提交,报错情况一模一样)

我的做法是先把这个树变成一个 index 为 1 对应 root 的数组vals,左子树 index 是 2*index, 右子树是 2*index+1 。

找到 p 的 index 是 pIndex ,q 的 index 是 qIndex ,然后在 boolean 数组visited里面把 p 的 parent 都标记为 true ,然后分析 q ,q 的第一个 visited 为 true 的地方就是最近的公共节点。

代码是这样:

class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if (root == null) {
                return null;
            }
            final int maxSize = 9000000;
            int[] vals = new int[maxSize];
            TreeNode[] nodes = new TreeNode[maxSize];
            boolean[] visited = new boolean[maxSize];
            var nodeStack = new ArrayDeque<TreeNode>();
            var indexStack = new ArrayDeque<Integer>();
            nodeStack.offerLast(root);
            indexStack.offerLast(1);
            int pIndex = 0, qIndex = 0;
            while (nodeStack.size() != 0) {
                var node = nodeStack.pollFirst();
                var index = indexStack.pollFirst();
                vals[index] = node.val;
                nodes[index] = node;
                if (node == p) {
                    pIndex = index;
                } else if (node == q) {
                    qIndex = index;
                }
                if (node.left != null) {
                    nodeStack.offerLast(node.left);
                    indexStack.offerLast(2 * index);
                }
                if (node.right != null) {
                    nodeStack.offerLast(node.right);
                    indexStack.offerLast(2 * index + 1);
                }
            }
            while (pIndex >= 1) {
                visited[pIndex] = true;
                pIndex /= 2;
            }
            TreeNode answer = null;
            while (qIndex >= 1) {
                if (visited[qIndex]) {
                    answer = nodes[qIndex];
                    break;
                }
                qIndex /= 2;
            }
            return answer;
        }
    }

报错是:

java.lang.ArrayIndexOutOfBoundsException: Index 12694084 out of bounds for length 9000000
  at line 21, Solution.lowestCommonAncestor
  at line 55, __DriverSolution__.__helper__
  at line 102, __Driver__.main

也就是说,我在第一个 while 里面第三行 val[index] = node.val 时,index 超过了 900000.

但是我在本地测试同样的数据,没有任何问题,能给出正确答案。

从逻辑上说,这个测试数据集给出了 20000 个节点,也不可能让 index 达到报错里面所说的 12694084 。。。(很简单的逻辑。。。)

真不知道出了什么问题。。。

3116 次点击
所在节点    程序员
26 条回复
learningman
2022-06-20 01:26:58 +08:00
为什么你们写算法题不用 C++啊👀
learningman
2022-06-20 01:27:48 +08:00
而且楼主你想传个大样例,为啥不找个 pastebin ,直接传楼里又丑又没高亮还费铜币
pengtdyd
2022-06-20 06:08:06 +08:00
@learningman 我也想说这个。。。。算法还是 C
movq
2022-06-20 08:22:28 +08:00
@learningman 做 /找什么语言的工作用什么语言刷题吧
ruanimal
2022-06-20 10:29:32 +08:00
为啥要用 c++。。。
kerrspace
2022-06-20 17:06:00 +08:00
@movq 单纯只是做算法题不应该 python 走起吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX