博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【剑指offer】让抽象问题具体化
阅读量:6716 次
发布时间:2019-06-25

本文共 3168 字,大约阅读时间需要 10 分钟。

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();    }

转载地址:http://lxelo.baihongyu.com/

你可能感兴趣的文章
WebService之Axis2快速入门(5): 管理会话(Session)
查看>>
以太坊RPC接口使用
查看>>
普通html标签<form>和struts2<s:form>的区别
查看>>
安装NTFS For Mac时显示文件已损坏怎么办
查看>>
-webkit-line-clamp实现多行文字溢出隐藏显示省略号
查看>>
配置sunspot tomcat结合sunspot_rails
查看>>
飞信系统4月29日升级后飞信机器人无法使用的解决办法
查看>>
Canonical今天宣布推出Plex Media Server作为Snap Store中的Snap应用程序
查看>>
Font Awesome
查看>>
Dubbo消费者
查看>>
虚拟化中虚拟机处理器核数与物理主机cpu的关系
查看>>
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type
查看>>
MYSQL: mysqlbinlog读取二进制文件报错read_log_event()
查看>>
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次...
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
java21:捕鱼达人
查看>>
Zabbix 服务端搭建
查看>>
Java - 一个单例
查看>>
学习JAVA 持续更新
查看>>