当前位置: 首页 > news >正文

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

相关文章:

  • 读书笔记1--力哥说理财:手把手教你玩转基金
  • [学习笔记]二叉树的遍历
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • leetcode388. Longest Absolute File Path
  • 后端_MYSQL
  • Java的Interrupt与线程中断
  • Go 领军人物谢孟军:智能制造渴望银弹,首先要摒弃偏见
  • Spark2.4.0源码分析之WorldCount ShuffleMapTask处理(八)
  • 技术总结(持续更新,偏自己看)
  • 小程序 setData 学问多
  • 洛谷P5163 WD与地图
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 轻松防止服务器被黑
  • spring cloud构建互联网分布式微服务云平台-服务网关zuul
  • 了解语音交互:从“若琪,今天杭州的天气”发生了什么?
  • 深入了解以太坊
  • overflow: hidden IE7无效
  • 闭包--闭包作用之保存(一)
  • 分布式熔断降级平台aegis
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 原生Ajax
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #define、const、typedef的差别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2015)JS ES6 必知的十个 特性
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十)c52学习之旅-定时器实验
  • (算法)前K大的和
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .Net FrameWork总结
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 指南:抽象化实现的基类
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net中应用SQL缓存(实例使用)
  • @取消转义
  • [BSGS算法]纯水斐波那契数列
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [Codeforces] probabilities (R1600) Part.1
  • [flask]http请求//获取请求头信息+客户端信息
  • [Google Guava] 2.1-不可变集合
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [LeetCode]Reverse Linked List II
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • [Nginx]反向代理Node将3000端口访问转换成80端口
  • [python] 之 函数简介
  • [Qualcomm][Power]QCM2290功耗异常问题