• 关于序列的面试题1 判断整数序列是否是二叉排序树的后续遍历


      看了BAT大牛的hulu面经。觉得真正牛B的公司就是要招真正牛B的人。真正牛B的人必须是既聪明努力的人。既然是不是聪明自己决定不了, 那还是自己努力一点吧。而且感觉到一点,面试问到的算法题都是很短时间就能写出来的算法。所以如果一些算法题的代码量超过100行,就不用专门去准备了。

      一面第1道面试题的题意是: 判断整数序列是不二叉排序树的后续遍历.

    题目:输入一个整数组,判断该是不某二元查找树的后序遍历结果。
    如果是返回 truet,否则返回 false 。
    例如输入 5、7、6、9、11 、10 、8,由于这一整数序列是如下树的后遍历结果:
       8
     /   \
    6    10
    / \    /  \
    5 7 9  11
    因此返回 true。
    如果输入 7、4、6、5,没有哪棵树的后序遍历结果是这个列,因此返回 false。

    这道题是july整理的微软面试100题当中的第9题。

    解法如下:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 bool isSeq(int a[], int start, int end)
     5 {
     6     if(start == end)
     7         return true;
     8     if(start > end)
     9         return false;
    10 
    11     int root = a[end-1];
    12     int i = start;
    13     while(i < end-1 && a[i] < root)
    14             i++;
    15 
    16     int postion = i;
    17     while(i < end - 1)
    18     {
    19         if(a[i] < root)
    20             return false;
    21         i++;
    22     }
    23     bool left = isSeq(a, start, i);
    24     bool right = isSeq(a, i, end-1);
    25 
    26     return left&&right;
    27     
    28 }
    29 
    30 int main()
    31 {
    32     int a[7] = {5, 7, 6, 9, 11, 10, 8};
    33     int b[4] = {7, 4 ,6, 5};
    34 
    35     bool A = isSeq(a, 0, 7);
    36     bool B = isSeq(b, 0, 4);
    37     
    38     printf("A: %d  B: %d\n", A, B); 
    39     return 0;
    40 } 

    结果为: A: 1  B: 0 。

    利用分治法来解决问题的时候, 划分区间通常为前闭后开,即为[start, i), [i, end)。 并且二分法的时间复杂度为O(nlgn)。

    附加问题:如果空间复杂度允许为O(n), 这道题能否优化。

    我想到的唯一优化方法,就是用栈来代替递归。但是时间复杂度是保持不变的。

    解法如下:

     1 bool isSeqNoRec(int a[], int start, int end)
     2 {
     3     int stack[100][2];
     4     if(start == end)
     5         return true;
     6     if(start > end)
     7         return false;
     8     int s, e, top = 0;
     9     stack[top][0] = start;
    10     stack[top][1] = end;
    11 
    12     while(top > -1)
    13     {
    14 
    15         s = stack[top][0];
    16         e = stack[top][1];
    17         top--;
    18         int root = a[e-1];
    19         int i = s;
    20         while(i < e - 1 && a[i] < root)
    21             i++;
    22 
    23         int position = i;
    24         while(i < e - 1)
    25         {
    26             if(a[i] < root)
    27                 return false;
    28             i++;
    29         }
    30         if(position > s)
    31         {
    32             stack[++top][0] = s;
    33             stack[top][1] = position;
    34         }
    35             
    36         if(position < e - 1)
    37         {
    38             stack[++top][0] = position;
    39             stack[top][1] = e-1;
    40         }
    41     }
    42     return true;
    43         
    44 }
    45 
    46 int main()
    47 {
    48     int a[7] = {5, 7, 6, 9, 11, 10, 8};
    49     int b[4] = {7, 4 ,6, 5};
    50 
    51     bool A = isSeqNoRec(a, 0, 7);
    52     bool B = isSeqNoRec(b, 0, 4);
    53     
    54     printf("A: %d  B: %d\n", A, B); 
    55     
    56     system("pause");
    57     return 0;
    58 } 

                       

  • 相关阅读:
    FJoi2017 1月21日模拟赛 comparison(平衡树+thita重构)
    juruo的刷题&博文祭
    [bzoj4247][挂饰] (动规+排序)
    FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)
    FJoi2017 1月20日模拟赛 交错和(等差数列+rmq)
    FJoi2017 1月20日模拟赛 恐狼后卫(口糊动规)
    【spoj 5971】lcmsum
    【bzoj 4025 改编版】graph
    【CF 718C】fibonacci
    【CF 482E】ELCA
  • 原文地址:https://www.cnblogs.com/iamccme/p/3091354.html
Copyright © 2020-2023  润新知