数组变树练习题
2016-03-18 18:28
218 查看
传送门:http://www.nowcoder.com/courses/1/4/9 购买视频请输入优惠码 AdVHxHT 可优惠10元
题目描述
对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这个方法。
给定一个无重复元素的数组A和它的大小n,请返回一个数组,其中每个元素为原数组中对应位置元素在树中的父亲节点的编号,若为根则值为-1。
测试样例:
AC 代码
class MaxTree {
public:
vector<int> buildMaxTree(vector<int> arr, int n) {
vector<int> leftMax(n),rightMin(n);
stack<int> s;
for (int i=0; i<n; i++) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
leftMax[i] = -1;
else
leftMax[i] = s.top();
s.push(i);
}
while (!s.empty())
s.pop();
for (int i=n-1; i>=0; --i) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
rightMin[i] = -1;
else
rightMin[i] = s.top();
s.push(i);
}
for (int i=0; i<n; ++i) {
if(rightMin[i]==-1)
continue;
if(leftMax[i]==-1&&rightMin[i]!=-1)
leftMax[i] = rightMin[i];
else{
if(arr[leftMax[i]]>arr[rightMin[i]])
leftMax[i
4000
] = rightMin[i];
}
}
return leftMax;
}
};
题目描述
对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这个方法。
给定一个无重复元素的数组A和它的大小n,请返回一个数组,其中每个元素为原数组中对应位置元素在树中的父亲节点的编号,若为根则值为-1。
测试样例:
[3,1,4,2],4
返回:[2,0,-1,2]
AC 代码
class MaxTree {
public:
vector<int> buildMaxTree(vector<int> arr, int n) {
vector<int> leftMax(n),rightMin(n);
stack<int> s;
for (int i=0; i<n; i++) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
leftMax[i] = -1;
else
leftMax[i] = s.top();
s.push(i);
}
while (!s.empty())
s.pop();
for (int i=n-1; i>=0; --i) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
rightMin[i] = -1;
else
rightMin[i] = s.top();
s.push(i);
}
for (int i=0; i<n; ++i) {
if(rightMin[i]==-1)
continue;
if(leftMax[i]==-1&&rightMin[i]!=-1)
leftMax[i] = rightMin[i];
else{
if(arr[leftMax[i]]>arr[rightMin[i]])
leftMax[i
4000
] = rightMin[i];
}
}
return leftMax;
}
};
相关文章推荐
- LeetCode 198. House Robber
- Python 在windows上安装BeautifulSoup
- 贪心算法—Problem Q
- setsockopt中参数之SO_REUSEADDR的意义
- Linux常用命令(自用)
- 关于 self 和 super 在oc 中 的疑惑 与 分析
- List、Map、Set的区别
- Android之EventBus使用详解
- 22. Generate Parentheses
- 删除字符串中的字符的两种情况
- 删除字符串中的字符的两种情况
- 感受惬意
- java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 81
- HZCoreMannger 使用一句话调用工具类,对数据进行操作
- Activity启动过程全解析
- Python同时替换多个字符串
- 据廖雪峰python3教程----python学习第二天
- 蓝桥杯-C题解之加法变乘法
- hdu4758 hdu2825 hdu4057 AC自动机与状态压缩dp的结合
- xilinx 的hdmi core 接收端调试成功。