一道百度面试题
2013-10-12 09:14
225 查看
给出一个整型数组num[],对其中的每个元素,输出在它左侧且比它小的最近元素,要求时间复杂度为O(n)。例如int num[]={2,4,1,3},2无左侧最近元素;4左侧最近的是2;1没有;3左侧最近的是1.
分析:创建一个栈,然后将数组中的元素从右至左依次压入栈中。对每个元素,入栈前先检查栈顶元素是否比它大,若是的话,则该元素即为栈顶元素的左侧最近小元素,输出结果,栈顶弹出,再看此时的新栈顶是否还比当前元素大。直到栈顶元素不大于当前元素时,再将该元素压入栈中。
当所有元素均压入栈时,栈中剩下的元素均不存在左侧最近小元素,将其结果输出。
代码如下:
分析:创建一个栈,然后将数组中的元素从右至左依次压入栈中。对每个元素,入栈前先检查栈顶元素是否比它大,若是的话,则该元素即为栈顶元素的左侧最近小元素,输出结果,栈顶弹出,再看此时的新栈顶是否还比当前元素大。直到栈顶元素不大于当前元素时,再将该元素压入栈中。
当所有元素均压入栈时,栈中剩下的元素均不存在左侧最近小元素,将其结果输出。
代码如下:
// [10/10/2013 qingezha] // 输出每个元素中,在它左侧且比它小的最近元素 void PrintEachMin(int num[], int len) { if(!num || len<=0) return ; stack<int> sta; // 对每个元素,进栈前先循环判断栈顶是否比它大,若是则该元素就是栈顶的左侧最近小元素 // 此时输出结果后,弹出栈顶元素。最后将该元素压入栈 for (int i=len-1; i>=0; --i){ while(!sta.empty() && num[i]<sta.top()){ printf("The nearest number of %d is %d!\n", sta.top(), num[i]); sta.pop(); } sta.push(num[i]); } // 此时栈中的所有元素均不存在左侧最近小元素 while(!sta.empty()){ printf("%d haven't nearest number!\n", sta.top()); sta.pop(); } }
相关文章推荐
- 一道淘汰85%面试者的百度开发者面试题
- 一道淘汰85%面试者的百度开发者面试题——解题、参考答案和优化思路
- 一道百度的面试题--写一个函数,对一个数字如(1000000),每隔3位添加一个','
- 编程挑战-一道淘汰85%面试者的百度开发者面试题
- 一道淘汰85%面试者的百度开发者面试题
- 一道淘汰85%面试者的百度开发者面试题
- 一道淘汰85%面试者的百度开发者面试题(更新)
- 百度的一道面试题(关于Cache的)
- ZZ一道百度面试题:求数组中出现次数超过一半的数
- 一道淘汰85%面试者的百度开发者面试题-我就是想知道正确的答案.
- 一道百度面试题---200元的组合方式有多少
- 一道百度面试题——位运算
- 一道百度算法面试题讲解
- 一道淘汰85%面试者的百度开发人员面试题
- 百度的一道面试题(关于Cache的)
- 一道让我无地自容的百度面试题
- 一道淘汰85%面试者的百度开发者面试题参考答案
- 面试经之一道淘汰85%面试者的百度开发者面试题
- 一道百度最新面试题的实现
- 一道百度面试题