查看: 1503| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 求 889 容易明白的代碼

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
感謝。

這題我做了半天....  求Java 容易理解的代碼

上一篇:python刷题数据结构总结(欢迎一起讨论)
下一篇:【经验贴】新手刷LeetCode:别再盲目刷题了! 硅谷工程师十分钟带你高效刷LeetCode!
🔗
iaukeit 2021-1-5 00:06:30 | 只看该作者
全局:
思想就是先把左边和右边的partition分别找出来, 然后递归找到他们的root。
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode() {}
  8. *     TreeNode(int val) { this.val = val; }
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     public TreeNode constructFromPrePost(int[] pre, int[] post) {
  18.         
  19.         int n = pre.length;
  20.         int m = post.length;
  21.         if(m != n || n == 0) return(null);
  22.         //System.out.println(Arrays.toString(pre));
  23.         //System.out.println(Arrays.toString(post));
  24.         TreeNode root = new TreeNode(pre[0]);
  25.         if(n == 1) return(root);
  26.         int[] preLoc = new int[31];
  27.         int[] postLoc = new int[31];
  28.         for(int i = 0; i < n; i++){
  29.             preLoc[pre[i]] = i;
  30.             postLoc[post[i]] = i;
  31.         }
  32.         int leftRootVal = pre[1];
  33.         int leftLen = postLoc[leftRootVal] + 1;
  34.         int rightLen = n - 1 - (postLoc[leftRootVal] + 1);
  35.         //System.out.println(leftLen);
  36.         //System.out.println(rightLen);
  37.         root.left = constructFromPrePost(Arrays.copyOfRange(pre, 1, leftLen + 1), Arrays.copyOfRange(post, 0, leftLen));
  38.         root.right = constructFromPrePost(Arrays.copyOfRange(pre, leftLen + 1, n), Arrays.copyOfRange(post, leftLen, n - 1));
  39.         return(root);
  40.     }

  41. }
复制代码

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
techDiscussion + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
sylvia2010 2021-1-5 02:00:35 | 只看该作者
全局:
本帖最后由 sylvia2010 于 2021-1-5 02:07 编辑

跟你分享个 Python 的答案吧,不用搞什么 partition. 就建立一个 stack, pre 里面的东西拿到就做成 node 放到 stack 里。末尾跟 post 一样就 pop, pop 的时候再建立连接。最后返回最后一次 pop 的节点。快得很。关键是那个 while 比较 tricky. 时间复杂度明显 O(n).

  1.     def constructFromPrePost(self, pre: List[int], post: List[int]) -> TreeNode:
  2.         s = []
  3.         i = 0
  4.         for a in pre:
  5.             n = TreeNode(a)
  6.             s.append(n)
  7.             while s and s[-1].val == post[i]:
  8.                 i += 1
  9.                 n = s.pop()
  10.                 if s:
  11.                     parent = s[-1]
  12.                     if not parent.left:
  13.                         parent.left = n
  14.                     else:
  15.                         parent.right = n
  16.         return n
复制代码


[/i]

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
techDiscussion + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
 楼主| techDiscussion 2021-1-5 02:29:29 | 只看该作者
全局:
謝謝各位!!! 我已經把答案整理好了!!
  1. class Solution {
  2.    
  3.     public TreeNode constructFromPrePost(int[] pre, int[] post) {
  4.         
  5.         Map<Integer, Integer> map = new HashMap<>();
  6.         
  7.         for (int i = 0; i < post.length; i++){
  8.             map.put(post[i], i);
  9.         }
  10.         
  11.         return dfs(pre, 0, pre.length - 1,
  12.                    post, 0, post.length - 1,
  13.                    map);
  14.     }
  15.    
  16.     private TreeNode dfs(int[] pre,  int preStart, int preEnd,
  17.                          int[] post, int postStart, int postEnd,
  18.                          Map<Integer, Integer> map)
  19.     {
  20.         
  21.         if (preStart > preEnd || postStart > postEnd) return null;
  22.          
  23.         TreeNode root = new TreeNode(pre[preStart]);
  24.         
  25.         if (preStart == preEnd ) return root;
  26.      
  27.         /*  pre = [1,           2,4,5,3,6,7]
  28.             post = [4,5,2,6,7,3,           1]
  29.         */
  30.          
  31.         int deltaIndex = map.get( pre[ preStart+1 ] ) - postStart;

  32.         root.left = dfs(pre, preStart + 1, preStart + 1 + deltaIndex,
  33.                         post, postStart, postStart + deltaIndex,
  34.                         map);

  35.         root.right = dfs(pre,  preStart + 1 + deltaIndex + 1, preEnd,
  36.                          post, postStart + deltaIndex + 1, postEnd - 1,
  37.                          map);
  38.          
  39.         return root;
  40.     }
  41. }
复制代码


回复

使用道具 举报

🔗
iaukeit 2021-1-5 06:13:23 | 只看该作者
全局:
techDiscussion 发表于 2021-1-5 02:29
謝謝各位!!! 我已經把答案整理好了!!
[mw_shl_code=java,true]class Solution {
   

node值比较小 可以不用map。
回复

使用道具 举报

🔗
 楼主| techDiscussion 2021-1-5 11:50:54 | 只看该作者
全局:
iaukeit 发表于 2021-1-5 06:13
node值比较小 可以不用map。

那用什麼?
回复

使用道具 举报

🔗
iaukeit 2021-1-5 20:30:21 | 只看该作者
全局:

就用array存就好了,一般来说array占用内存少 速度也会快一些。
回复

使用道具 举报

🔗
 楼主| techDiscussion 2021-1-6 06:47:43 | 只看该作者
全局:
iaukeit 发表于 2021-1-5 20:30
就用array存就好了,一般来说array占用内存少 速度也会快一些。

明白,你意思是說,把value當坐標,把index當array的值,對嘛?
回复

使用道具 举报

🔗
perseids 2021-1-7 09:26:38 | 只看该作者
全局:

map的本质是什么?  就是个key value pair.  在key 的空间太大的时候用各种hash算法, key的可能性很小的时候就上数组了, 数组性能更好,代码也简单。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表