2021-10-15leecocde每日打卡+随机一题

38. 外观数列

描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 "3322251" 的描述如下图:

思路:

  1. 运用递归思想,通过不断获取countAndSay(n-1)得到的结果来计算当前n的结果,把问题分割成多个小问题。
  2. 控制变量i的变化,从第二次循环开始,i应该第一个跟last[i]不相等的数字的下标,即i=j,比如在“11221”中,进入第二次循环时,i=2;第三次循环,i=4。
  3. 默认变量count为1,最后一齐把count和last[i]一齐push进sb数组里,在通过通过sb.join('')把结果变为字符串。

代码:

var countAndSay = function(n) {
    if (n == 1) return "1"
    let sb=[]
    let last=countAndSay(n-1)
    for(let i=0;i<last.length;){
        let count=1;
        for(j=i+1;j<last.length;j++){
            if(last[i]==last[j]){
                count++;
            }
            else{ 
                break;
            }
        }
        sb.push(''+count+last[i])
        i=j
    }
    sb=sb.join('')
    return sb
};

剑指 Offer 33. 二叉搜索树的后序遍历序列


思路:

二叉搜索树是left < root < right的,后序遍历的顺序是left->right->root,乍一看,好像没有办法保证单调性,不过我们可以做一个变化,后序遍历的逆序:

root->right->left

发现什么了吗?是的,这是换了一个方向的先序遍历,从root开始,先遍历右子树,再遍历左子树。怎么做到先root,然后right,最后left呢,只要我们反向遍历数组,这样我们就可以利用单调栈了。

  • 下面说说单调递增栈的思路和用法。

翻转先序遍历又是root->right->left的,基于这样的性质和遍历方式,我们知道越往右越大,这样,就可以构造一个单调递增的栈,来记录遍历的元素。

为什么要用单调栈呢,因为往右子树遍历的过程,value是越来越大的,一旦出现了value小于栈顶元素value的时候,就表示要开始进入左子树了(如果不是,就应该继续进入右子树,否则不满足二叉搜索树的定义,不理解的请看下二叉搜索树的定义),但是这个左子树是从哪个节点开始的呢?

单调栈帮我们记录了这些节点,只要栈顶元素还比当前节点大,就表示还是右子树,要移除,因为我们要找到这个左孩子节点直接连接的父节点,也就是找到这个子树的根,只要栈顶元素还大于当前节点,就要一直弹出,直到栈顶元素小于节点,或者栈为空。栈顶的上一个元素就是子树节点的根。

接下来,数组继续往前遍历,之后的左子树的每个节点,都要比子树的根要小,才能满足二叉搜索树,否则就不是二叉搜索树。

代码:

var verifyPostorder = function(postorder) {
      var root = Number.MAX_VALUE
    var stack = [] 
    for(let i = postorder.length - 1;i >= 0;i--)
    {
        if(postorder[i] > root) return false
        while(stack.length && postorder[i] < stack[stack.length -1])
        {
            root = stack.pop()
        }
        stack.push(postorder[i])
    }
    return true
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 题目重述 输入一个整数 n,请计算并返回该整数「各位数字之积」与「各位数字之和」的差 例如: 输入:567 返...
    北北夜曦阅读 338评论 0 1
  • ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018:...
    小白白程序猿阅读 1,776评论 0 0
  • 第一题: 整数反转[https://leetcode-cn.com/problems/reverse-intege...
    糖糖超可爱阅读 294评论 0 1
  • 10.01_面向对象(package关键字的概述及作用)(了解) A:为什么要有包将字节码(.class)进行分类...
    冰川_阅读 608评论 0 1
  • 内置对象(2) 我们平时忙于开发,很少有时间能够将文档看一遍。这样在很多时候,我们本可以一个原生方法能够实现的程序...
    汨逸阅读 229评论 0 0