H*7
2 楼
All Posters Coupon: 20% off $15 or More Including Clearance: 6 posters for $
14 + Free Shipping
All Posters.com Coupons & Deals Buy Now ►
AllPosters.com offers an additional 20% off on top of their already-reduced
Clearance Prices when you spend $15 or more and apply coupon code DEGASV at
checkout. Some of the Posters end up being just $2.39 each when you purchase
6 or more. Shipping is free with this coupon code. Thanks shootkey
14 + Free Shipping
All Posters.com Coupons & Deals Buy Now ►
AllPosters.com offers an additional 20% off on top of their already-reduced
Clearance Prices when you spend $15 or more and apply coupon code DEGASV at
checkout. Some of the Posters end up being just $2.39 each when you purchase
6 or more. Shipping is free with this coupon code. Thanks shootkey
b*s
3 楼
外面秋光正好,姐姐我上街溜达去了!
这个时候就觉得养狗好啊,秋高气爽,正是牵狗漫步的好时候....
这个时候就觉得养狗好啊,秋高气爽,正是牵狗漫步的好时候....
d*n
5 楼
我要买。coupon哪里搞?
谢谢
谢谢
N*t
6 楼
在家养病中 =((((((
i*i
9 楼
外面大雪纷飞,我穿成皮球,准备出门party去了
t*e
11 楼
谢谢谢谢,这就去看看。
$
reduced
at
purchase
【在 H******7 的大作中提到】
: All Posters Coupon: 20% off $15 or More Including Clearance: 6 posters for $
: 14 + Free Shipping
: All Posters.com Coupons & Deals Buy Now ►
: AllPosters.com offers an additional 20% off on top of their already-reduced
: Clearance Prices when you spend $15 or more and apply coupon code DEGASV at
: checkout. Some of the Posters end up being just $2.39 each when you purchase
: 6 or more. Shipping is free with this coupon code. Thanks shootkey
$
reduced
at
purchase
【在 H******7 的大作中提到】
: All Posters Coupon: 20% off $15 or More Including Clearance: 6 posters for $
: 14 + Free Shipping
: All Posters.com Coupons & Deals Buy Now ►
: AllPosters.com offers an additional 20% off on top of their already-reduced
: Clearance Prices when you spend $15 or more and apply coupon code DEGASV at
: checkout. Some of the Posters end up being just $2.39 each when you purchase
: 6 or more. Shipping is free with this coupon code. Thanks shootkey
k*n
14 楼
不错。。
l*8
20 楼
说说我的想法:
从末尾向前扫描,试图建立一棵BST (不一定要真正建立树结构)
当前节点A[idx]是当前子树的根,同时也维护当前子树的合法数值范围[min_val, max_
val]. 初始数值范围是 [INT_MIN, INT_MAX]。 进入A[idx]的右子树,数值范围就是[
A[idx], old max_val]; 左子树范围是[old min_val, A[idx]]
对于A[idx-1],
如果比A[idx]大,就放到试图放到右子树里面,如果不能满足数值范围, 就返回parent
节点再试。
如果 <= A[idx],就放到试图放到左子树里面,如果不能, 就返回parent节点再试。
这样一遍扫描数组, 如果所有数值都能合法放进BST,就返回true, 否则false。
从末尾向前扫描,试图建立一棵BST (不一定要真正建立树结构)
当前节点A[idx]是当前子树的根,同时也维护当前子树的合法数值范围[min_val, max_
val]. 初始数值范围是 [INT_MIN, INT_MAX]。 进入A[idx]的右子树,数值范围就是[
A[idx], old max_val]; 左子树范围是[old min_val, A[idx]]
对于A[idx-1],
如果比A[idx]大,就放到试图放到右子树里面,如果不能满足数值范围, 就返回parent
节点再试。
如果 <= A[idx],就放到试图放到左子树里面,如果不能, 就返回parent节点再试。
这样一遍扫描数组, 如果所有数值都能合法放进BST,就返回true, 否则false。
l*a
21 楼
我同意你扫描一遍inout array就可以完成
问题是对于其中某个/些值,有可能需要在当前路径上回溯来判断需要插在哪个位置
所以我不认为这是O(n)
max_
是[
parent
【在 l*********8 的大作中提到】
: 说说我的想法:
: 从末尾向前扫描,试图建立一棵BST (不一定要真正建立树结构)
: 当前节点A[idx]是当前子树的根,同时也维护当前子树的合法数值范围[min_val, max_
: val]. 初始数值范围是 [INT_MIN, INT_MAX]。 进入A[idx]的右子树,数值范围就是[
: A[idx], old max_val]; 左子树范围是[old min_val, A[idx]]
: 对于A[idx-1],
: 如果比A[idx]大,就放到试图放到右子树里面,如果不能满足数值范围, 就返回parent
: 节点再试。
: 如果 <= A[idx],就放到试图放到左子树里面,如果不能, 就返回parent节点再试。
: 这样一遍扫描数组, 如果所有数值都能合法放进BST,就返回true, 否则false。
问题是对于其中某个/些值,有可能需要在当前路径上回溯来判断需要插在哪个位置
所以我不认为这是O(n)
max_
是[
parent
【在 l*********8 的大作中提到】
: 说说我的想法:
: 从末尾向前扫描,试图建立一棵BST (不一定要真正建立树结构)
: 当前节点A[idx]是当前子树的根,同时也维护当前子树的合法数值范围[min_val, max_
: val]. 初始数值范围是 [INT_MIN, INT_MAX]。 进入A[idx]的右子树,数值范围就是[
: A[idx], old max_val]; 左子树范围是[old min_val, A[idx]]
: 对于A[idx-1],
: 如果比A[idx]大,就放到试图放到右子树里面,如果不能满足数值范围, 就返回parent
: 节点再试。
: 如果 <= A[idx],就放到试图放到左子树里面,如果不能, 就返回parent节点再试。
: 这样一遍扫描数组, 如果所有数值都能合法放进BST,就返回true, 否则false。
p*2
24 楼
post order, 最后一个值是root
从开始扫,比root小的是左树,后边的就是右树了,应该都比root的值大。
recursion就可以了吧?这是最straightforward的思路了。
从开始扫,比root小的是左树,后边的就是右树了,应该都比root的值大。
recursion就可以了吧?这是最straightforward的思路了。
l*8
27 楼
贴个代码吧:
int scanPostOrder(int *A, int idx, int minVal, int maxVal)
{
if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
int val = A[idx];
idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
return scanPostOrder(A, idx, minVal, val); // 左子树
}
bool checkPostOrder(int *A, int n)
{
return scanPostOrder(A, n-1, INT_MIN, INT_MAX) < 0;
}
【在 l*********8 的大作中提到】
: 我的思路就是O(n)的。
int scanPostOrder(int *A, int idx, int minVal, int maxVal)
{
if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
int val = A[idx];
idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
return scanPostOrder(A, idx, minVal, val); // 左子树
}
bool checkPostOrder(int *A, int n)
{
return scanPostOrder(A, n-1, INT_MIN, INT_MAX) < 0;
}
【在 l*********8 的大作中提到】
: 我的思路就是O(n)的。
f*e
29 楼
不错,我的也是O(N),不过没有你这个直观。
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
p*2
33 楼
这题又一次显示了longway的最简洁code 的超能力。
e*e
35 楼
My code, da niu zhi dian. Thanks.
public boolean checkPostorder(int[] A) {
return checkPostorderCore( A, 0, A.length-1);
}
boolean checkPostorderCore(int[] A, int s, int e) {
if ( s == e || s + 1 == e )
return true;
int value = A[e];
int i = s;
for ( ; i < e; i++ ) {
if ( A[i] > value )
break;
}
if ( i == e || i == s )
return false;
i--;
return checkPostorderCore(A, s, i) && checkPostorderCore(A, i+1, e-1);
}
public boolean checkPostorder(int[] A) {
return checkPostorderCore( A, 0, A.length-1);
}
boolean checkPostorderCore(int[] A, int s, int e) {
if ( s == e || s + 1 == e )
return true;
int value = A[e];
int i = s;
for ( ; i < e; i++ ) {
if ( A[i] > value )
break;
}
if ( i == e || i == s )
return false;
i--;
return checkPostorderCore(A, s, i) && checkPostorderCore(A, i+1, e-1);
}
l*8
38 楼
请测试下面两个合法的post order系列:
1 2 3 4
4 3 2 1
【在 e****e 的大作中提到】
: My code, da niu zhi dian. Thanks.
: public boolean checkPostorder(int[] A) {
: return checkPostorderCore( A, 0, A.length-1);
: }
: boolean checkPostorderCore(int[] A, int s, int e) {
: if ( s == e || s + 1 == e )
: return true;
: int value = A[e];
: int i = s;
: for ( ; i < e; i++ ) {
1 2 3 4
4 3 2 1
【在 e****e 的大作中提到】
: My code, da niu zhi dian. Thanks.
: public boolean checkPostorder(int[] A) {
: return checkPostorderCore( A, 0, A.length-1);
: }
: boolean checkPostorderCore(int[] A, int s, int e) {
: if ( s == e || s + 1 == e )
: return true;
: int value = A[e];
: int i = s;
: for ( ; i < e; i++ ) {
w*o
39 楼
来一个不递归的:
boolean validate(int[] A) {
//int[] A = {4,3,2,1};
Stack s = new Stack();
int max = Integer.MAX_VALUE;
for(int i = A.length - 1; i >= 0; i--) {
int x = A[i];
if(x > max) {
return false;
}
while(!s.empty() && x < s.peek()) {
max = s.pop();
}
s.push(x);
}
return true;
}
boolean validate(int[] A) {
//int[] A = {4,3,2,1};
Stack
int max = Integer.MAX_VALUE;
for(int i = A.length - 1; i >= 0; i--) {
int x = A[i];
if(x > max) {
return false;
}
while(!s.empty() && x < s.peek()) {
max = s.pop();
}
s.push(x);
}
return true;
}
g*u
40 楼
我觉得你的算法是对的. 一个小优化是找两个subarray的分界点可以用二分查找. 但是
在递归过程中必须维护当前子树的值的上下界,一旦越界就报错. 我觉得不值得这么折
腾.
还有一个办法就是反向读数组, 然后重建BST. 每读一个数都应该可以找到二叉树中唯
一插入的位置, 如果找不到的话就报错. 但是找插入位置的过程的复杂度至少是树的高
度,也就是O(log N), 所以总体还是O(N logN), 实现的复杂度就差多了.
【在 d**e 的大作中提到】
: 这样行不行?
: 1. array[n-1]为root
: 2. 遍历数组,看能不能找到两个subarray, 第一个root
: 3. 如果2为false返回false,否则去4
: 4. 对两个subarray递归操作1,2,3
在递归过程中必须维护当前子树的值的上下界,一旦越界就报错. 我觉得不值得这么折
腾.
还有一个办法就是反向读数组, 然后重建BST. 每读一个数都应该可以找到二叉树中唯
一插入的位置, 如果找不到的话就报错. 但是找插入位置的过程的复杂度至少是树的高
度,也就是O(log N), 所以总体还是O(N logN), 实现的复杂度就差多了.
【在 d**e 的大作中提到】
: 这样行不行?
: 1. array[n-1]为root
: 2. 遍历数组,看能不能找到两个subarray, 第一个
: 3. 如果2为false返回false,否则去4
: 4. 对两个subarray递归操作1,2,3
s*l
41 楼
http://fayaa.com/code/view/27365/
【在 g*******r 的大作中提到】
: 给一个数组,判定是否可能是一个BST后序遍历得到的
: 这题大家啥思路?
k*r
43 楼
厉害啊,
要是我在面试时遇到这个题,我就会
1,建立树,
2,in order读树,
3,判断是不是递增。
不会想到您这个方法。
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
要是我在面试时遇到这个题,我就会
1,建立树,
2,in order读树,
3,判断是不是递增。
不会想到您这个方法。
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
f*p
47 楼
递归可以解。如果是后序遍历结果,最后一个数x一定是根节点。前面比x小的是左子树
,比x大的是右子树,这个位置可以二分法查找。左右子树可以递归判断。复杂度是n
log n吧。
,比x大的是右子树,这个位置可以二分法查找。左右子树可以递归判断。复杂度是n
log n吧。
Q*e
49 楼
贴一个实现.
int
validate_postorder(int nums[], int start, int end)
{
int i, j;
if (start >= end) return 1;
i = start;
while (i < end && nums[i] < nums[end]) i++;
i--;
j = end - 1;
while (j >= start && nums[j] > nums[end]) j--;
j++;
if (i + 1 < j) {
return (0);
} else {
return (validate_postorder(nums, start, i) &&
validate_postorder(nums, j, end-1)) ;
}
}
int
validate_postorder(int nums[], int start, int end)
{
int i, j;
if (start >= end) return 1;
i = start;
while (i < end && nums[i] < nums[end]) i++;
i--;
j = end - 1;
while (j >= start && nums[j] > nums[end]) j--;
j++;
if (i + 1 < j) {
return (0);
} else {
return (validate_postorder(nums, start, i) &&
validate_postorder(nums, j, end-1)) ;
}
}
l*b
51 楼
这个太厉害了,哈哈
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
【在 l*********8 的大作中提到】
: 贴个代码吧:
: int scanPostOrder(int *A, int idx, int minVal, int maxVal)
: {
: if (idx < 0 || A[idx] < minVal || A[idx] > maxVal)
: return idx; //如果不能满足数值范围,或者已经扫描完毕,就返回到父节点
: int val = A[idx];
: idx = scanPostOrder(A, idx-1, val, maxVal); // 右子树
: return scanPostOrder(A, idx, minVal, val); // 左子树
: }
: bool checkPostOrder(int *A, int n)
w*x
52 楼
递归就可以了,几行代码
z*t
55 楼
相关阅读