构造MaxTree
链接:https://www.nowcoder.com/questionTerminal/a502c7c3c65e41fdaf65eec9e0654dcb
来源:牛客网
[编程题]构造MaxTree
对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请证明这个方法的正确性,同时设计O(n)的算法实现这个方法。
给定一个无重复元素的数组A和它的大小n,请返回一个数组,其中每个元素为原数组中对应位置元素在树中的父亲节点的编号,若为根则值为-1。
测试样例:
[3,1,4,2],4
返回:[2,0,-1,2]
算法如下:
对于每个节点,寻找左右两个第一个大于它的数,选择其中的较小点作为父亲节点
现在需要证明
- 每个点最多只有两个子节点
利用反证法,假设节点i的某一侧有两个儿子节点,设为k1,k2。
因为数组中不存在重复元素,所以可以假设\(k1<k2\),那么根据算法,k1会以k2为父节点,于假设不符
k1>k2的话,k2根本就不会找到i,同样不符。
因此得证 - 最后形成的是一颗树
除了根节点,所有节点的都会有一个比它大的父节点,由于根节点是数组中最大的节点,那么所有的
节点最终都会指向根节点。
最后为了寻找相邻最大数,使用单调栈算法即可,关于单调栈的设计和证明:http://www.cnblogs.com/zsyacm666666/p/6812896.html
public int[] buildMaxTree(int[] A, int n) {
// write code here
int ans[]=new int[A.length];
int lb[]=new int[A.length];
int rb[]=new int[A.length];
Arrays.fill(lb,-1);Arrays.fill(rb,-1);
Stack<Integer>stack=new Stack<>();
for(int i=0;i<A.length;i++) {
while(!stack.empty()&&A[stack.peek()]<A[i]) {
stack.pop();
}
if(!stack.empty()) lb[i]=stack.peek();
stack.push(i);
}
while(!stack.empty()) stack.pop();
for(int i=A.length-1;i>=0;i--) {
while(!stack.empty()&&A[stack.peek()]<A[i]) {
stack.pop();
}
if(!stack.empty()) rb[i]=stack.peek();
stack.push(i);
}
for(int i=0;i<A.length;i++) {
if(lb[i]==-1&&rb[i]==-1) ans[i]=-1;
else if(lb[i]==-1) ans[i]=rb[i];
else if(rb[i]==-1) ans[i]=lb[i];
else ans[i]=(A[lb[i]]<A[rb[i]]?lb[i]:rb[i]);
}
return ans;
}
构造MaxTree的更多相关文章
- (算法)构造MaxTree
题目: 给定一个没有重复元素的数组A,定义A上的MaxTree如下:MaxTree的根节点为A中最大的数,根节点的左子树为数组中最大数左边部分的MaxTree,右子树为数组中最大数右边部分的MaxTr ...
- 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...
- 构造数组的MaxTree
题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 左神算法进阶班3_1构造数组的MaxTree
题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...
- 算法总结之 构造数组MaxTree
一个数组的MaxTree定义如下: 数组必须没有重复元素 MaxTree是一颗二叉树,数组的每一个值对应一个二叉树的节点 包括MaxTre树在内且在其中的每一颗子树上,值最大的节点都是树的头 给定一个 ...
- 左神算法书籍《程序员代码面试指南》——1_08构造数组的MaxTree
[题目] 将一个没有重复数字的数组中的数据构造一个二叉树 每个节点都是该子树的最大值 [要求] 时间复杂度为O(N)[题解] 使用单调栈,栈的顺序是维持从大到小排序 通过使用单调栈,将数组中中所有数的 ...
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
- 一步步构造自己的vue2.0+webpack环境
前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...
随机推荐
- django接受表单
from django.shortcuts import render from django.shortcuts import HttpResponse import os # Create you ...
- Helvetic Coding Contest 2017 online mirror (teams allowed, unrated) M
Description The marmots have prepared a very easy problem for this year's HC2 – this one. It involve ...
- Sereja and Brackets(括号匹配)
Description Sereja has a bracket sequence s1, s2, ..., sn, or, in other words, a string s of length ...
- 关于list,字符串的小记录
1.关于操作list的命令: a.append("hi") 这个可以在list的最后一项加上个这个字符串"hi",a是list的名字. del a[3] 删去l ...
- jQuery removeAttr() 源码解读
removeAttr比attr的代码要简单很多~~~ removeAttr: function( name ) { return this.each(function() { jQuery.remov ...
- jquery 选择器包含特殊字符
选择器包含 : .# ( ] 等等 比如 <div id="id#a"></div> <div id="id[1]">< ...
- new几种用法
在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...
- Chrome插件制作
由于网上很难找到关于Chrome插件制作的中文教程,为了总结和方便更多的开发者,本文以最常见的显示效果为browser_action的二维码插件为例,进行相关阐述.前端童鞋开发的话应该很简单的,鄙人是 ...
- https为数据传输保驾护航
为什么要使用https 谷歌官网已宣布,今年7月起,Chrome浏览器的地址栏将把所有HTTP标示为不安全网站. 在客户端与服务器数据传输过程中,http协议传输是不安全的,一般情况下,http协议的 ...
- Unity查找物体的四大主流方法及区别
GameObject.Find()优点: 使用简单方便不会因为重名而报错,同时查找的是自上而下的第一个物体缺点 不能查找被隐藏的物体,否则出现“空引用异常”,这是很多新人在查找出现空引用bug的原因. ...