剑指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; ...
随机推荐
- Spring源码阅读-BeanFactory体系结构分析
BeanFactory是Spring中非常重要的一个类,搞懂了它,你就知道了bean的初始化和摧毁过程,对于深入理解IOC有很大的帮助. BeanFactory体系结构 首先看一下使用IDEA生成的继 ...
- Vue响应式原理底层代码模拟实现
整体分析Vue的基本结构如下图所示:(备注:完整代码github地址https://github.com/1512955040/MiniVue) 上图中,为我们模拟最小vue的整体结构,首先创建一个v ...
- MySQL学习07(规范化数据库设计)
规范化数据库设计 当数据库比较复杂时我们需要设计数据库 糟糕的数据库设计 : 数据冗余,存储空间浪费 数据更新和插入的异常 程序性能差 良好的数据库设计 : 节省数据的存储空间 能够保证数据的完整性 ...
- 文件流FileStream技术出现的理由漫谈
输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流 ...
- 【原创】深入分析Ubuntu本地提权漏洞CVE-2017-16995
*本文首发阿里云先知安全技术社区,原文链接https://xz.aliyun.com/t/2212 前言: 2018年3月中旬,Twitter 用户 @Vitaly Nikolenko 发布消息,称 ...
- 带头撸抽奖系统,DDD + RPC 开发分布式架构!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.咋,撸个项目? 总有粉丝伙伴问傅哥,有没有能上手练习技术的项目,现在学了这么多技术知识.看 ...
- idea中的springboot的maven项目报错Failed to clean project: Failed to delete D:\new_shunyi\shunyi\target\shunyi\WEB-INF\classes\static\
正准备打包上传到测试环境,本想先clean下,没想到报了个这个错,意思大概是无法删除target下的某个文件,没有权限(一脸懵逼): 后来百度发现可能是因为我之前启动了tomcat,未关闭,然后关闭了 ...
- java String数组城市
String[] citys = {"北京","天津","河北","山西","内蒙古"," ...
- Python环境变量配置
第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载,请注意,当你的电脑是32位的机器,请选择32位的安装包,如果是64 ...
- Linux下用gdb 调试、查看代码堆栈
Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...