`

Google面试题(六)

阅读更多
题目:对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。

分析:要使pop,push,min都是O(1),所以肯定要牺牲点空间

思路:1:在stack的数据结构中加两个个字段,如

     typedef struct {

           int data[MAX];

           int top;

           int min;

           int second;

     }stack;

          pop,push的时候都去栈顶元素,所以是O(1)

          min的时候取stack的min字段,所以也是O(1)

         每次push的时候进行比较,如果当前push的元素比stack->min小,则用当前元素替换stack->min,用原来的min替换second。如果当前push的元素比stack->min大,但比second小,则用当前元素替换stack->second。于是达到了取min的效果,程序如下

          int push(stack * s,int x){

                 ASSERT(s!=NULL);

                 if(s->top>=MAX) 

                 {

                        printf("Stack overload!");

                        return -1;

                 }

                 s->data[s->top++]=x;

                 if(x<s->min)

                  s->min=x;

                 return 0;

        }
        每次pop的时候进行比较,如果pop的元素为min,则用second替换min。于是达到了取min的效果,程序如下
        int pop(stack *s,int *x)

        {

               ASSERT(s!=NULL);

              if(s->top<=0)

              {

                      printf("Stack Empty!");

                      return -1;

             }

            (*x)=s->data[s->top--];
            if(x==s->min) s->min=s->second;
           return 0;

}

int min( stack *s,int *x )

{

      ASSERT(s!=NULL);

      (*x)=s->min;

     return 0;

}


思路2:设置辅助栈ass,记录每个状态下的最小值,每次插入时,得到辅助栈当前值,和插入的值比较

如果小则插入到最小值栈的就是它,否则就是原来的最小值,通过这种方式,pop,push,min三个都是

O(1)算法的。

typedef struct {

     int data[MAX];

     int top;

}stack;

STATIC int push_stack(stack *s,int x)

{

      ASSERT((s!=NULL));

      if(s->top>=MAX)

      {

            printf("Stack overload");

            return -1;

      }

     s->data[s->top++]=x;

     return 0;

}

STATIC int pop_stack(stack *s,int *x)

{

      ASSERT(s!=NULL);

      if(s->top<=0)

      {

              printf("Stack Empty");

              return -1;

       }

       (*x)=s->data[s->top--];

       return 0;

}

int push(stack *main,stack *ass,int x)

{

       ASSERT((main!=NULL)&&(ass!=NULL));

       int temp;

       pop_stack(ass,&temp);

       push_stack(main,x);

       if(x<temp)

       {

               push_stack(ass,temp);

               push_stack(ass,x);

       }

       else

       {

                push_stack(ass,temp);

                push_stack(ass,temp);

       }

       return 0;

}

int pop(stack *main,stack *ass,int *x)

{

        ASSERT((main!=NULL)&&(ass!=NULL));

       int temp;

       pop_stack(ass,&temp);

       pop_stack(main,x);

       return 0;

}

int min(stack *ass,int *x)

{

       ASSERT((main!=NULL)&&(ass!=NULL));

       pop_stack(ass,x);

       push_stack(ass,(*x));

       return 0;
}

1
2
分享到:
评论
11 楼 loveofgod 2008-02-18  
在push时将每个数包装成一个结点,如果这样的话,当push的点很大时,空间复杂度会很高
10 楼 loveofgod 2008-02-18  
ddbird,那你说pop push min的复杂度多少,嗯对,push没问题,pop的时候会出问题
9 楼 JohnnyJian 2008-02-16  
引用
我认为min() O(1)的做法应该是在push时将每个数包装成一个结点,结点中两个数,一个是要压入的数,另一个记录压入前已经在栈中的的最小值。后面的就容易了,我不说了。

You're right!
8 楼 ggggqqqqihc 2008-02-15  
我认为min() O(1)的做法应该是在push时将每个数包装成一个结点,结点中两个数,一个是要压入的数,另一个记录压入前已经在栈中的的最小值。后面的就容易了,我不说了。
7 楼 zuroc 2008-02-15  
这个好像很简单?
还是我的理解有问题.........
6 楼 JohnnyJian 2008-02-15  
引用
min是O(1) 用堆就可以了,但是要pop push min 都 O(1) 似乎有难度。

RE,我就是这个意思……
5 楼 ddbird 2008-02-15  
min是O(1) 用堆就可以了,但是要pop push min 都 O(1) 似乎有难度。
4 楼 ddbird 2008-02-15  
引用
每次pop的时候进行比较,如果pop的元素为min,则用second替换min。于是达到了取min的效果,程序如下
int pop(stack *s,int *x)



连续push 5个数 然后连续pop 3次,second 是什么值???
光用一个second就能起到排序的作用??? 明显不对的!
3 楼 loveofgod 2008-02-15  
请问哪里错了?上面的解答难道不是O(1)吗?
2 楼 JohnnyJian 2008-02-14  
而且我怀疑求min是否有O(1)的算法,因为即使用优先队列,也要O(logN)的复杂度……
1 楼 JohnnyJian 2008-02-14  
这是官方的答案吗?好像都是错的哦……

相关推荐

    GOOGLE面试题集锦

    Google面试题集锦 在当今社会,Google作为全球顶尖的科技公司,其招聘流程和面试题一直备受业界关注。公司的面试流程设计严谨,面试题目覆盖面广泛,既考察应聘者的基本技术知识,又深挖其逻辑思维能力、创造力以及...

    11谷歌面试题精讲

    11谷歌面试题精讲

    程序员面试题精选 C++ 算法 微软 google

    程序员面试题精选 C++ 算法 微软 google 程序员面试题精选 C++ 算法 微软 google

    微软面试题解答google微软等大公司面试题

    微软公司面试人员的面试题解答,google微软等大公司面试题,软件架构师的设计。

    15个Google面试题以及答案

    15个Google面试题以及答案。对于的相关职位产品经理、软件工程师等。

    08-谷歌面试题-08-谷歌面试题

    谷歌面试题解析 本资源摘要信息中,我们将对谷歌面试题进行详细的解析和知识点总结。 知识点1:数据库基本操作 在面试题中,我们可以看到基本的数据库操作命令,如create database、use database、create table、...

    google面试题.pdf

    ### Google面试题解析 #### 一、一辆校车能装下多少个高尔夫球? **职位:** 产品经理 **解析:** 这类问题考察应聘者的逻辑思维能力和数学估算能力。解题步骤如下: 1. **估计尺寸:** 先估计一辆标准校车的...

    BAT谷歌微软等各IT公司互联网C++ JAVA 计算机笔试面试真题复习资料108个文档合集.zip

    C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案.docx c++笔试题汇总.pdf C++经典面试题库 附带参考答案.docx C++语言程序设计试题.docx C++面试题笔试题 CC+...

    google面试题题及数学趣题

    标题《Google面试题及数学趣题》涉及的内容主要涵盖了两大部分:Google的面试题目分析以及一些锻炼思维能力的数学趣题。Google面试题作为IT行业求职者关注的焦点,它们不仅是面试的门槛,更被视为衡量应聘者技术水平...

    google公司笔试面试题合集

    以下是对"google公司笔试面试题合集"中可能包含的知识点的详细解析: 1. **算法与数据结构**: - 面试中常见的算法题包括排序(快速排序、归并排序、堆排序等)、查找(二分查找、哈希表查找)、图论(最短路径、...

    google(谷歌)笔试面试题

    根据给定文件的信息,我们可以提炼出一系列与Google(谷歌)笔试面试相关的知识点,涉及编程、算法、计算机系统原理等多个方面。 ### 1. 递归函数的理解与应用 #### 标题:`int cal(int x)` 函数分析 **描述**: ...

    各个公司面试题 面试题

    在IT行业的面试中,面试题通常涵盖了广泛的领域,包括但不限于编程语言、数据结构、算法、操作系统、计算机网络、数据库管理、软件工程、项目管理、云计算、人工智能、前端开发、后端开发等。以下是对这些常见面试题...

    mit 教授整理的google 面试题

    【谷歌面试题解析】 在科技巨头谷歌的面试过程中,算法和数据结构的掌握是至关重要的。这份由MIT(麻省理工学院)教授整理的资料,旨在帮助求职者充分准备谷歌的面试挑战。以下是对其中核心知识点的详细解读。 1. ...

    最新微软谷歌Google面试题怪题

    【微软和谷歌面试题解析】 微软和谷歌等顶级科技公司的面试题目往往别具一格,旨在测试应聘者的逻辑思维、创新能力和快速反应能力。这些题目并非寻找标准答案,而是评估应聘者的思维方式和解决问题的策略。 1. **...

    网络管理员面试题,IT技术支持面试题

    这里是两份详细的面试资料和习题,在很多公司的面试中,都是以此两份面试题作为模板,其中有很多经典的提问,答案不唯一,希望有心的读者能够自己去BAIDU,GOOGLE查找。这里不提供答案。

    程序员面试题精选100题-何海涛

    《程序员面试题精选100题—何海涛》是一份详实的IT面试准备资料,由何海涛整理发布,旨在帮助应届毕业生和求职者准备面向微软、谷歌等知名科技公司的面试。此资料不仅收录了精选的100道面试题目,还提供了详细的解题...

    微软、Google等面试题

    从给定的文件信息来看,这里探讨的主题是程序员面试题,特别是那些来自知名科技公司如微软、Google等的面试题目。文件中提到的“程序员面试题精选100题”显然是一个精心挑选的集合,旨在帮助应届毕业生和求职者更好...

    Google的15道面试题与答案

    1. **递归问题解决**:在第一道面试题中,涉及的是一个逻辑推理和递归的问题。妻子们需要通过观察其他丈夫的行为来判断自己的丈夫是否偷情。这个问题展示了递归思维的应用,即解决问题的过程可以分解为更小的相同或...

    Google面试题

    在准备Google面试的过程中,了解和掌握相关技术和面试技巧至关重要。Google作为全球领先的科技公司,其面试过程往往涉及广泛的计算机科学基础知识、编程技能以及问题解决能力。对于Java开发者来说,尤其需要扎实的...

    C++ JAVA 计算机笔试面试真题复习资料BAT谷歌微软等各IT公司互联网面试笔试资料库合集(108个).zip

    IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 web开发 中兴资料 微软笔试面试 数据库面试题笔试题 百度笔试面试 算法 数据结构 网易搜狐新浪笔试面试 腾讯笔试面试 计算机基础 计算机网络 软件测试 阿里...

Global site tag (gtag.js) - Google Analytics