【剑指offer】让抽象问题具体化
1.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路
1.定义两个栈,一个栈用于存储数据,另一个栈用于存储每次数据进栈时栈的最小值.
2.每次数据进栈时,将此数据和最小值栈的栈顶元素比较,将二者比较的较小值再次存入最小值栈.
4.数据栈出栈,最小值栈也出栈。
3.这样最小值栈的栈顶永远是当前栈的最小值。
代码
var dataStack = [];
var minStack = [];
function push(node)
{
dataStack.push(node);
if(minStack.length === 0 || node < min()){
minStack.push(node);
}else{
minStack.push(min());
}
}
function pop()
{
minStack.pop();
return dataStack.pop();
}
function top()
{
var length = dataStack.length;
return length>0&&dataStack[length-1]
}
function min()
{
var length = minStack.length;
return length>0&&minStack[length-1]
}
2.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路
1.借助一个辅助栈来存储数据。
2.将pushV中的数据依次入栈。
3.出栈有可能在任意一次入栈后进行,当出栈数据不再位于栈顶,继续入栈。
4.所以设置一个索引,记录当前出栈的位置,每次出栈索引+1。
5.当所有数据入栈完成,如果出栈顺序正确,那么辅助栈应该为空。
代码
function IsPopOrder(pushV, popV) {
if (!pushV || !popV || pushV.length == 0 || popV.length == 0) {
return;
}
var stack = [];
var idx = 0;
for (var i = 0; i < pushV.length; i++) {
stack.push(pushV[i]);
while (stack.length && stack[stack.length - 1] == popV[idx]) {
stack.pop();
idx++;
}
}
return stack.length == 0;
}
3.题二叉树的后续遍历
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
1.后序遍历:分成三部分:最后一个节点为跟节点,第二部分为左子树的值比跟节点都小,第三部分为右子树的值比跟节点都大。
2.先检测左子树,左侧比跟节点小的值都判定为左子树。
3.除最后一个节点外和左子树外的其他值为右子树,右子树有一个比跟节点小,则返回false。
4.若存在,左、右子树,递归检测左、右子树是否复合规范。
代码
function VerifySquenceOfBST(sequence) {
if (sequence && sequence.length > 0) {
var root = sequence[sequence.length - 1]
for (var i = 0; i < sequence.length - 1; i++) {
if (sequence[i] > root) {
break;
}
}
for (let j = i; j < sequence.length - 1; j++) {
if (sequence[j] < root) {
return false;
}
}
var left = true;
if (i > 0) {
left = VerifySquenceOfBST(sequence.slice(0, i));
}
var right = true;
if (i < sequence.length - 1) {
right = VerifySquenceOfBST(sequence.slice(i, sequence.length - 1));
}
return left && right;
}
}
4.二叉树中和为某一值的路径
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路
1.使用前序遍历
2.使用一个辅助栈来存储当前路径里的数据
3.记录一个当前路径的和
4.遍历到当前节点后,当前值入路径栈,和加当前值
5.递归左孩子右孩子节点
6.遍历完一个节点,退回到上一个节点,从路径栈中移除当前的值,和减当前值
代码
function FindPath(root, expectNumber) {
var result = [];
if (!root) {
return result;
}
findPath(root, expectNumber, [], 0, result);
return result;
}
function findPath(node, expectNumber, vector, sum, result) {
vector.push(node.val);
sum += node.val;
var isLeaf = !node.left && !node.right;
if (isLeaf && sum === expectNumber) {
result.push(vector.slice(0));
}
if (node.left) {
findPath(node.left, expectNumber, vector, sum, result);
}
if (node.right) {
findPath(node.right, expectNumber, vector, sum, result);
}
vector.pop();
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hibernate的入门(Hibernate的环境搭建、Hibernate的API)
- pytest 测试框架学习(9):pytest.main
- 深入了解ActiveMQ!
- 完美解决 python ImportError: Failed to import any qt binding
- 爬取娱乐圈排行榜数据
- 如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录
- pytest 测试框架学习(10):pytest.param
- pytest 测试框架学习(11):pytest.raises
- Hibernate第二天:Hibernate的一级缓存、其他的API
- pytest 测试框架学习(12):pytest.deprecated_call
- Pinstaller(Python打包为exe文件
- pytest 测试框架学习(14):pytest.warns
- ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib
- pytest 测试框架学习(15):pytest.freeze_includes
- Linux: scp文件,目录上传下载标准版