剑指offer计划28(搜索与回溯算法困难)—java

1.1、题目1

剑指 Offer 37. 序列化二叉树

1.2、解法

这题给我笑死了,我看到题解有个解法,我愿称之为神。

public class Codec {

    private TreeNode root;
    // Encodes a tree to a single string.

    public String serialize(TreeNode root) {
        this.root = root;
        return null;
    }

    // Decodes your encoded data to tree.

    public TreeNode deserialize(String data) {
        return root;
    }
}

真的是神仙般的人物。
这里serialize是通过BFS遍历实现的,存放到StringBuilder中最终转String返回。
deserialize也是BFS,只不过是反操作。

1.3、代码


public class Codec {
    public String serialize(TreeNode root) {
        if(root == null) return "[]";
        StringBuilder res = new StringBuilder("[");
        Queue queue = new LinkedList<>() {{ add(root); }};
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(node != null) {
                res.append(node.val + ",");
                queue.add(node.left);
                queue.add(node.right);
            }
            else res.append("null,");
        }
        res.deleteCharAt(res.length() - 1);
        res.append("]");
        return res.toString();
    }

    public TreeNode deserialize(String data) {
        if(data.equals("[]")) return null;
        String[] vals = data.substring(1, data.length() - 1).split(",");
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        Queue queue = new LinkedList<>() {{ add(root); }};
        int i = 1;
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(!vals[i].equals("null")) {
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.left);
            }
            i++;
            if(!vals[i].equals("null")) {
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }
}

2.1、题目2

剑指 Offer 38. 字符串的排列

2.2、解法

回溯的万能模板

def backtrack(...):
    for 选择 in 选择列表:
        做选择
        backtrack(...)
        撤销选择

这里也挺奇怪,居然不是返回list,就定了hashset最后再遍历进字符串数组返回,
注意这里是不重复,所以,创建要给visited数组来判断是否遍历过该字符。

2.3、代码


class Solution {
    HashSet res = new HashSet();
    boolean []visited;
    public String[] permutation(String s) {
        visited = new boolean[s.length()];
        StringBuffer stringb = new StringBuffer();
        back(s,stringb);
        String []resarr = new String[res.size()];
        int i=0;
        for(String a:res){
            resarr[i]=a;
            i++;
        }
        return resarr;
    }
    public void back(String s,StringBuffer stringb){
        if(stringb.length()==s.length()) {
            res.add(stringb.toString());
            return;
        }
        for(int i=0;i

Original: https://www.cnblogs.com/cxykhaos/p/15346348.html
Author: 程序员khaos
Title: 剑指offer计划28(搜索与回溯算法困难)—java

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598454/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Windows下PowerShell监控Keepalived

    一、 背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell…

    Linux 2023年5月28日
    086
  • docker相关命令杂理

    – 2020.11.16docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #保存现有的镜像 # docker commit …

    Linux 2023年6月8日
    077
  • rsync

    Rsync-远程同步 简介 rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同…

    Linux 2023年6月13日
    058
  • 【socket】基于Linux使用select上报温度–服务端

    select使用 * – select函数 – select流程图 – 服务端代码实现 select函数 select监视并等待多个文件描述符的…

    Linux 2023年6月13日
    078
  • NO.6 HTML+CSS 笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    085
  • 【设计模式】Java设计模式-模板模式

    Java设计模式 – 模板模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个有梦有戏的人…

    Linux 2023年6月6日
    0131
  • 十二、启动流程

    启动流程介绍 现代计算机系统启动是硬件与软件复杂组合。从定义的端点开始,到拥有登录提示符的运行中系统,需要大量的硬件和软件配合工作。以下列表从较高层面概述了启动系统时所涉及的任务。…

    Linux 2023年6月7日
    090
  • zabbix快速安装(yum)

    1、先卸载系统自带数据库 [root@bogon ~]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 –nodeps 2、安装mys…

    Linux 2023年6月6日
    076
  • 重载规则

    1、可重载的运算符 + – * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >&gt…

    Linux 2023年6月13日
    082
  • Java 内功修炼 之 数据结构与算法(一)

    (1)双向链表通过上面单链表相关操作,可以知道 单链表的 查找方向唯一。而双向链表在 单链表的 基础上在 添加一个指针域(pre),这个指针域用来指向 当前节点的上一个节点,从而实…

    Linux 2023年6月11日
    0100
  • 一篇文章学会shell脚本

    一、Shell传递参数 运行: 二、Shell数组 运行: 三、Shell运算符 1、算术运算符 注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的…

    Linux 2023年5月28日
    085
  • 如何写出健壮可靠的shell脚本

    1 脚本失败时即退出 ; set -e 例子: 可以在脚本的开头设置如下set -e 2 打印脚本执行过程 sh -x test.sh #整个过程执行了哪些命令或者在开头加上set…

    Linux 2023年5月28日
    078
  • Redis 优化之 tcp-backlog

    tcp-backlog:511 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/soma…

    Linux 2023年5月28日
    089
  • LeetCode-补充题9. 36进制加法

    题目来源 题目详情 36进制由0-9,a-z,共36个字符表示。 要求按照加法规则计算出任意两个36进制正整数的和,如1b + 2x = 48 (解释:47+105=152) 要求…

    Linux 2023年6月7日
    096
  • 前端之HTML

    一、HTML介绍 1.1 web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80…

    Linux 2023年6月14日
    075
  • [LINUX] 在 Win10 上搭建好用的终端开发环境:windows terminal + git bash + zsh + oh-my-zsh

    1、安装 git for windows 2、安装终端 2.1 Windows Terminal 2.1.1 安装 Windows Terminal 2.1.2 设置 Window…

    Linux 2023年6月8日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球