剑指offer计划20( 搜索与回溯算法中等)---java
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的更多相关文章
- 剑指offer 计划1(栈与队列)---java
1.1.题目1 剑指 Offer 09. 用两个栈实现队列 1.2.解法 解法如题目所说.定义两个栈.这里假设第一个栈为a,第二个栈为b. 实现两个函数增加尾和删除头. 增加即直接push入第一个栈. ...
- 剑指offer计划19( 搜索与回溯算法中等)---java
1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为fal ...
- 剑指offer(20)包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...
- 剑指offer计划5(查找算法中等版)---java
1.1.题目1 剑指 Offer 04. 二维数组中的查找 1.2.解法 其实就是暴力解法的升级版,从最后一行开始判断,通过num当前的大小, 如果还是大于目标值则行数-1,若是小于则列数+1 1.3 ...
- 剑指offer计划9(动态规划中等版)---java
1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...
- 剑指offer计划16( 排序简单)---java
1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...
- 剑指offer计划25(模拟中等)---java
1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...
- 剑指offer计划27(栈与队列困难)---java
1.1.题目1 剑指 Offer 59 - I. 滑动窗口的最大值 1.2.解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非严格递减) 在未形成窗口前,先构 ...
- 剑指offer面试题5 从头到尾打印链表(java)
注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...
随机推荐
- Shell-13-常用文件目录
linux系统目录结构 环境变量文件 系统级 系统级变量文件对所有用户生效 #系统范围内的环境变量和启动文件. #不建议把要做的事情写在这里面,最好创建一个自定义的,放在/etc/profile.d ...
- 【笔记】numpy.array基础(1)
numpy.array基础 使用numpy.__version__可以检查numpy的版本 当然也可以直接使用命令行检查numpy版本 也可以用来简化引用,使用as python list特点 num ...
- 【笔记】Stacking方法
Stacking 先前学习的集成学习 先前的思路很简单,假设有三个算法,每个算法都对数据进行一个预测,最后综合这三个结果得出一个最终结果,对于分类问题可以进行少数服从多数,对于回归问题可以简单地取平均 ...
- 利用ST-LINK配合ST-LINK Utility 将bin文件下载到STM32的FLASH中
文章目录 背景 1.连接ST-LINK V2与单片机 2.配置工程 3.配置ST-LINK Utility 4.烧录bin文件 背景 项目需求,要把字模文件导入到32中FLASH的指定地址,使用了ST ...
- kubebuilder实战之一:准备工作kubebuilder实战之一:准备工作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- NOIP 模拟 $32\; \rm Smooth$
题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但 ...
- adobe cc 系列产品更改默认安装路径方法
通过Adobe Creative Cloud 修改 1.在开始菜单中找到图下程序点开,并进行如下操作: 2.点击Apps位置 等待加载出软件,如图下所示. 点击右上角图标,会弹出以下窗口,点击首选项 ...
- C# 中的CTS, CLS, CLR 的理解
- 彻底搞懂volatile关键字
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事.这篇文章将从多个方面来讲解volatile,让你对它更加理解. ...
- [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击
MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...