边工作边刷题:70天一遍leetcode: day 84-1
Verify preorder sequence of Binary Search Tree
要点:simulating preorder sequence:
- 根据preorder的特点,首先会一直向left subtree方向访问,并且值递减。当遇到一个非递减元素是,说明这个是某个当前路径上结点作为根的right subtree上的点。
- 首先我们要找到这个根结点:如果之前把所有元素都存到stack里,stack按pop顺序是从小到大的,不断pop,最后一个小于当前元素的结点即为root(记法:因为不断更新low,所以root.val最终在low里)。另外xstack[-1]就停了,也就是把作为right subtree处理。
- invalid:pop出来的以后,序列都要更大:因为不断向右子树方向走(parent的root已经访问过),low是不断变大的。下一个low可能往父节点走,也可能继续右子树。之后的结点必须大于low,否则invalid
https://repl.it/CfR8/1
错误点:注意[9,5,7,8]这是valid的,如果把8放在root 9右边当然不符合,但是也可以放到7右边,preorder并不是唯一的。
recursion approach
- based on: preorder序列的第一个点把值域分割:所以很容易adapt到top-down approach
- recursion:每层loop:根据中点値找到left/right tree的交接点:这样可以recurse到left/right subtree
- loop中验证subtree的值不能超过上层pass下来的区间
- redundant: loop中的验证重复进行多次
https://tonycao.gitbooks.io/leetcode-locked/content/LeetCode Locked/c1.14.html
O(1): 要点是重用当前sequence:因为stack的size不会超过当前遍历的元素。用global i来记录stack top的位置即可,所以用sequence的[0,i]来存stack。
错误点:注意i表示当前栈顶,那么初始化为-1。
https://repl.it/Cf1t
# Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
# You may assume each number in the sequence is unique.
# Follow up:
# Could you do it using only constant space complexity?
# Hide Company Tags Zenefits
# Hide Tags Tree Stack
# Hide Similar Problems (M) Binary Tree Preorder Traversal
class Solution(object):
def verifyPreorder(self, preorder):
"""
:type preorder: List[int]
:rtype: bool
"""
low = -sys.maxint
stk = []
for p in preorder:
if p<low:
return False
while stk and p>stk[-1]:
low = stk.pop()
stk.append(p)
return True
import sys
class Solution:
# @param {integer[]} preorder
# @return {boolean}
def verifyPreorder(self, preorder):
low = -sys.maxint
i = -1
for x in preorder:
if x < low:
return False
while i>=0 and x>preorder[i]:
low = preorder[i]
i-=1
i+=1
preorder[i]=x
return True
sol = Solution()
print sol.verifyPreorder([2, 4, 1])
print sol.verifyPreorder([40, 30, 35, 80, 100])
print sol.verifyPreorder([40, 30, 35, 20, 80, 100])
边工作边刷题:70天一遍leetcode: day 84-1的更多相关文章
- 边工作边刷题:70天一遍leetcode: day 84
Flatten 2D Vector 要点: 这题是2d的iterator,一般对于1d的情况,hasNext()是不需要做移动的.而2d不同,core iterator是j向的,而i向要在hasNex ...
- 边工作边刷题:70天一遍leetcode: day 89
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...
- 边工作边刷题:70天一遍leetcode: day 77
Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...
- 边工作边刷题:70天一遍leetcode: day 78
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- 边工作边刷题:70天一遍leetcode: day 101
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...
- 边工作边刷题:70天一遍leetcode: day 1
(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 边工作边刷题:70天一遍leetcode: day 71-3
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...
- 边工作边刷题:70天一遍leetcode: day 71-2
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...
随机推荐
- python函数和常用模块(一),Day3
set集合 函数 三元运算 lambda表达式 内置函数1 文件操作 set集合 创建 se = {"123", "456"} # 直接创建一个集合 se = ...
- 设置让ASP.NET管道接收所有类型的请求
在web.config文件添加如下一段配置: <configuration> <system.webServer> <modules runAllManagedModul ...
- Android5.0新特性——新增的Widget(Widget)
新增的Widget RecyclerView RecyclerView是ListView的升级版,它具备了更好的性能,且更容易使用.和ListView一样,RecyclerView是用来显示大量数据的 ...
- pace.js和NProgress.js两个加载进度插件的一点小总结
这两个插件都是关于加载进度动画的,应该说各有特点吧,最起码对我来说是各有优势的.今天一天就捣鼓了加载进度动画,也研究了大量的(也就这两个)加载进度动画,也算对加载进度动画有了一个初步的了解了吧. NP ...
- [js开源组件开发]js多选日期控件
js多选日期控件 详情请见:http://www.lovewebgames.com/jsmodule/calendar.html 它的github地址:https://github.com/tianx ...
- 微信jssdk,实现多图上传的一点心得
一.首先在common.js里封装一个函数,在需要调用jsSDK的页面引用此方法即可实现微信的信息配置function signatureJSSDK() { var url = window.loca ...
- js 操作ASP.NET服务器控件
js 操作ASP.NET服务器控件 在ASP.NET中使用js时,js获取DOM元素时,经常获取不到,这是因为获取的方法有误,现在介绍一方法,解决如何使用js获取ASP.NET控件在浏览器端生成htm ...
- android:descendantFocusability=”blocksDescendants”的用法
android:descendantFocusability用法简析 开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承B ...
- asp xmlhttp 读取文件
Response.Write LoadTxtFile("URL") Function LoadTxtFile(LoadFile) Dim XMLHTTP, XMLDOC, Resp ...
- iOS开发笔记1:ToDoList、相册、地图应用及新浪微博
前段时间做了一些小东西,一些关键点记录总结如下 1.ToDoList 主要是使用UITableView以及NSUserDefaults完成任务管理,可新建.编辑及删除任务. 因为是Demo性质,所以利 ...