- 浏览: 750229 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011487470:
感觉就是知识采集一样,博主能不能整理一下
基于Web的IM简介 -
whxtbest:
whxtbest 写道2里面:如果T本身就是重复的话 比如 ...
关于后缀树的一些理解 -
whxtbest:
2里面:如果T本身就是重复的话 比如S是aaab,T是aa ...
关于后缀树的一些理解 -
刘亮love小雪:
谢谢啦
Java 2D高级绘图 -
bluky999:
收集的资料挺多的 哈哈
基于Web的IM简介
题目:对现在的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;
}
You're right!
RE,我就是这个意思……
连续push 5个数 然后连续pop 3次,second 是什么值???
光用一个second就能起到排序的作用??? 明显不对的!
分析:要使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;
}
评论
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)
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
这是官方的答案吗?好像都是错的哦……
发表评论
-
求交集和并集的线性算法
2011-10-24 23:00 5363对于给定的两个集合,使用哈希表可以在线性时间复杂度内得到他们的 ... -
关于后缀树的一些理解
2008-10-01 21:07 9068要理解suffix tree就首先 ... -
面试题集锦
2008-09-29 17:24 36051. 时针分针重合几次 表面上有60个小格,每小格代表一分钟, ... -
词频统计的C++实现
2008-03-10 16:01 3789#include <map> # ... -
Google面试题(九)
2008-02-20 00:13 278325匹马赛跑,5个跑道,怎么以最少的比赛次数来决出最快的3匹, ... -
数据结构面试大全
2008-02-19 12:50 44941.判断链表是否存在环 ... -
Google面试题(七)
2008-02-14 03:35 3068很多Google考生出来,也 ... -
Google面试题(五)
2008-02-14 02:30 2690几星期前,一个朋友接 ... -
Google面试题(四)
2008-02-13 22:07 228526个英文字母从新排序(未知的顺序alphabet),然后用这 ... -
google面试题(三)
2008-02-13 06:22 2533算法题一:Given 1 GB memory, input a ... -
google面试题(二)
2008-02-11 01:43 3541平面上N个点,求一条直线,穿过的点数最多 思路:2点确定一条 ... -
google面试题(一)
2008-02-11 01:27 2513有一个random number generator,是生成真 ... -
数据结构和算法中容易忽略的要点总结[未完待续]
2008-02-10 23:44 14651。递归需要有个递归出口,否则会是infinite的递归 -
矩阵求逆的快速算法
2008-02-10 20:40 3950算法介绍 矩阵求逆在3D ... -
约瑟夫问题
2008-02-10 09:57 2018有n个人围成一圈,顺序编号。从第一个人开始报数,凡报到m的人退 ... -
hash函数学习总结,以及与hashcode()、hashMap的关系
2008-02-10 06:21 7485以前一直觉得hash函数很 ... -
突然发现没真正领悟哈希表
2008-02-10 05:11 2573在一个字符串中找到第 ... -
[微软面试题]请把一个整形数组中重复的数字去掉
2008-02-10 04:08 4383请把一个整形数组a中重复的数字去掉 方法一: for i ... -
Java版堆排序
2008-02-09 23:41 1193/** * author Akalius Kung 2008 ... -
Java版插入排序
2008-02-09 04:40 1501/** * author Akalius Kung 2008 ...
相关推荐
GOOGLE面试题集锦 在 IT 行业中,面试是企业选拔人才的重要步骤之一,而 Google 作为全球顶尖的科技公司,其面试方式也备受关注。Google 面试题集锦就是一个集合了 Google 面试题的资源,涵盖了逻辑、数学、算法等...
11谷歌面试题精讲
程序员面试题精选 C++ 算法 微软 google 程序员面试题精选 C++ 算法 微软 google
微软公司面试人员的面试题解答,google微软等大公司面试题,软件架构师的设计。
15个Google面试题以及答案。对于的相关职位产品经理、软件工程师等。
谷歌面试题解析 本资源摘要信息中,我们将对谷歌面试题进行详细的解析和知识点总结。 知识点1:数据库基本操作 在面试题中,我们可以看到基本的数据库操作命令,如create database、use database、create table、...
### Google面试题解析 #### 一、一辆校车能装下多少个高尔夫球? **职位:** 产品经理 **解析:** 这类问题考察应聘者的逻辑思维能力和数学估算能力。解题步骤如下: 1. **估计尺寸:** 先估计一辆标准校车的...
C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案.docx c++笔试题汇总.pdf C++经典面试题库 附带参考答案.docx C++语言程序设计试题.docx C++面试题笔试题 CC+...
标题《Google面试题及数学趣题》涉及的内容主要涵盖了两大部分:Google的面试题目分析以及一些锻炼思维能力的数学趣题。Google面试题作为IT行业求职者关注的焦点,它们不仅是面试的门槛,更被视为衡量应聘者技术水平...
以下是对"google公司笔试面试题合集"中可能包含的知识点的详细解析: 1. **算法与数据结构**: - 面试中常见的算法题包括排序(快速排序、归并排序、堆排序等)、查找(二分查找、哈希表查找)、图论(最短路径、...
根据给定文件的信息,我们可以提炼出一系列与Google(谷歌)笔试面试相关的知识点,涉及编程、算法、计算机系统原理等多个方面。 ### 1. 递归函数的理解与应用 #### 标题:`int cal(int x)` 函数分析 **描述**: ...
在IT行业的面试中,面试题通常涵盖了广泛的领域,包括但不限于编程语言、数据结构、算法、操作系统、计算机网络、数据库管理、软件工程、项目管理、云计算、人工智能、前端开发、后端开发等。以下是对这些常见面试题...
【谷歌面试题解析】 在科技巨头谷歌的面试过程中,算法和数据结构的掌握是至关重要的。这份由MIT(麻省理工学院)教授整理的资料,旨在帮助求职者充分准备谷歌的面试挑战。以下是对其中核心知识点的详细解读。 1. ...
【微软和谷歌面试题解析】 微软和谷歌等顶级科技公司的面试题目往往别具一格,旨在测试应聘者的逻辑思维、创新能力和快速反应能力。这些题目并非寻找标准答案,而是评估应聘者的思维方式和解决问题的策略。 1. **...
这里是两份详细的面试资料和习题,在很多公司的面试中,都是以此两份面试题作为模板,其中有很多经典的提问,答案不唯一,希望有心的读者能够自己去BAIDU,GOOGLE查找。这里不提供答案。
《程序员面试题精选100题—何海涛》是一份详实的IT面试准备资料,由何海涛整理发布,旨在帮助应届毕业生和求职者准备面向微软、谷歌等知名科技公司的面试。此资料不仅收录了精选的100道面试题目,还提供了详细的解题...
从给定的文件信息来看,这里探讨的主题是程序员面试题,特别是那些来自知名科技公司如微软、Google等的面试题目。文件中提到的“程序员面试题精选100题”显然是一个精心挑选的集合,旨在帮助应届毕业生和求职者更好...
1. **递归问题解决**:在第一道面试题中,涉及的是一个逻辑推理和递归的问题。妻子们需要通过观察其他丈夫的行为来判断自己的丈夫是否偷情。这个问题展示了递归思维的应用,即解决问题的过程可以分解为更小的相同或...
在准备Google面试的过程中,了解和掌握相关技术和面试技巧至关重要。Google作为全球领先的科技公司,其面试过程往往涉及广泛的计算机科学基础知识、编程技能以及问题解决能力。对于Java开发者来说,尤其需要扎实的...
IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 web开发 中兴资料 微软笔试面试 数据库面试题笔试题 百度笔试面试 算法 数据结构 网易搜狐新浪笔试面试 腾讯笔试面试 计算机基础 计算机网络 软件测试 阿里...