1.1、题目1

剑指 Offer 07. 重建二叉树

1.2、解法

注释解法。

1.3、代码


class Solution {
int[] preorder;
HashMap<Integer, Integer> map = new HashMap<>();
// 前序遍历 preorder: 根 -- 左 -- 右 第一个肯定是根节点
// 中序遍历 inorder: 左 -- 根 -- 右
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i);
}
return rebuild(0, 0, inorder.length - 1);
} // pre_root_index : 根节点 在 前序遍历中的下标
// in_left_index: 该节点在中序遍历中的左边界
// in_right_index: 该节点在中序遍历中的右边界
public TreeNode rebuild(int pre_root_index, int in_left_index, int in_right_index){
if(in_left_index > in_right_index) return null;
// 根节点在中序遍历中的位置:in_root_index
int in_root_index = map.get(preorder[pre_root_index]);
// 创建一个根节点
TreeNode node = new TreeNode(preorder[pre_root_index]);
// 寻找node的左节点:
// 在前序遍历中的位置就是 根节点的下标 + 1(右边一个单位)
// 在中序遍历中的位置就是: 1. 左边界不变,2. 右边界就是根节点的左边一个单位 in_root_index - 1
node.left = rebuild(pre_root_index + 1, in_left_index, in_root_index - 1);
// 寻找node的右节点:
// 在前序遍历中的位置就是 根节点的下标 + 左子树长度 + 1
// 在中序遍历中的位置就是: 1. 左边界在根节点的右边一个单位 in_root_index + 1, 2. 右边界不变
node.right = rebuild(pre_root_index + in_root_index - in_left_index + 1, in_root_index + 1, in_right_index);
return node;
}
}

2.1、题目2

剑指 Offer 16. 数值的整数次方

2.2、解法

分类讨论,判断内容,通过将数拆开两半来减少性能消耗(容易栈溢出)

2.3、代码


class Solution {
public double myPow(double x, int n) {
if(n<0) return 1/(x*myPow(x,-n-1)) ;
else if(n==0) return 1;
else if(n==1) return x;
else{
double res=myPow(x,n/2);
return res*res*myPow(x,n%2); }
}
}

3.1、题目3

剑指 Offer 33. 二叉搜索树的后序遍历序列

3.2、解法

递归开始判断,找到第一个大于根节点的值,然后找出左子树和右子树的两个区间,

通过递归再次判断

3.3、代码

class Solution {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder,0,postorder.length - 1);
}
boolean recur(int[] postorder, int start, int end){
if(start >= end) return true;
int temp = start;
// 找到右子树结点第一次出现的地方。(或者说是遍历完整棵左子树)
for(int i = start; i <= end; ++i){
if(postorder[i] < postorder[end]){
temp = i;
}
else break;
}
int rightTreeNode = temp + 1; // 后序遍历右子树时会访问的第一个结点的下标。
// 验证右子树所有结点是否都大于根结点。
for(int i = rightTreeNode; i <= end; ++i){
if(postorder[i] > postorder[end])
++rightTreeNode;
}
return rightTreeNode == end && recur(postorder,start,temp) && recur(postorder,temp + 1,end - 1);
}
}

剑指offer计划20( 搜索与回溯算法中等)---java的更多相关文章

  1. 剑指offer 计划1(栈与队列)---java

    1.1.题目1 剑指 Offer 09. 用两个栈实现队列 1.2.解法 解法如题目所说.定义两个栈.这里假设第一个栈为a,第二个栈为b. 实现两个函数增加尾和删除头. 增加即直接push入第一个栈. ...

  2. 剑指offer计划19( 搜索与回溯算法中等)---java

    1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为fal ...

  3. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  4. 剑指offer计划5(查找算法中等版)---java

    1.1.题目1 剑指 Offer 04. 二维数组中的查找 1.2.解法 其实就是暴力解法的升级版,从最后一行开始判断,通过num当前的大小, 如果还是大于目标值则行数-1,若是小于则列数+1 1.3 ...

  5. 剑指offer计划9(动态规划中等版)---java

    1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...

  6. 剑指offer计划16( 排序简单)---java

    1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...

  7. 剑指offer计划25(模拟中等)---java

    1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...

  8. 剑指offer计划27(栈与队列困难)---java

    1.1.题目1 剑指 Offer 59 - I. 滑动窗口的最大值 1.2.解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非严格递减) 在未形成窗口前,先构 ...

  9. 剑指offer面试题5 从头到尾打印链表(java)

    注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...

随机推荐

  1. VueApp 自动更新解决plus is not defined问题

    一,今天用VueApp 做自动更新调用按照网上列子直接 Plus 打包编译后出现了plus is not defined 发现需要引用document.addEventListener("p ...

  2. Git出错:“Please make sure you have the correct access rights and the repository exists.”

    此问题是需要重置ssh密钥 解决步骤如下: 1.重置用户名和邮箱: 打开Git Bash 进入Git命令,输入以下命令 git config --global user.name "你的用户 ...

  3. ESP32CAM 人脸识别追踪

    引言 总体实现的流程:ESP32cam作为客户端,pc作为服务端通过mqtt协议建立通信,将采集的图像在电脑端显示人脸识别的方法使用的是opencv,并通过mqtt传输指令给esp32cam控制舵机云 ...

  4. ASP.NET Core端点路由中三种让人困惑的路由函数

    早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和 路由,其核心目的是将 请求落地点与路由寻址方式解耦. 这里面有几个容易混淆的函数 MapControllerRoute M ...

  5. net start mongodb 提示:发生系统错误 5,拒绝访问。

    问题: net start mongodb 提示:发生系统错误 5,拒绝访问. 无法启动mongodb 服务. 解决办法: 右键cmd,选择以管理员身份运行即可

  6. chcon命令详解

    导读 chcon命令是修改对象(文件)的安全上下文,比如:用户.角色.类型.安全级别.也就是将每个文件的安全环境变更至指定环境.使用--reference选项时,把指定文件的安全环境设置为与参考文件相 ...

  7. Charles 抓包 Client SSL handshake failed - Remote host closed connection during handshake

    Charles 抓包 https 报错: Client SSL handshake failed - Remote host closed connection during handshake # ...

  8. 程序员必须知道的数据结构:HashMap 与 LinkedHashMap

    为什么要说 HashMap 与 LinkedHashMap?第一:这两种数据结构是 Java Coder 中经常使用的数据结构.第二:这两种结构是最合适的能说明链表与数组的结构关系.在开始之前首先必须 ...

  9. ConcurrentModificationException异常原因和解决方法

    一.ConcurrentModificationException异常出现的原因 先看下面这段代码: public class Test { public static void main(Strin ...

  10. 微信小程序学习笔记五 常见组件

    1. 常见组件 重点讲解小程序中常用的布局组件 1.1 view 代替 原来的div标签 <!-- pages/index/index.wxml --> <view hover-cl ...