您的位置:首页 > 其它

给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素

2013-08-21 16:30 344 查看
参考:http://blog.csdn.net/yysdsyl/article/details/5419149

题目:

     给定数组Arr
,对于其中的每个元素Arr[i](0=<i<n),在Arr[0...i-1]中找到元素Arr[k],Arr[k]满足Arr[k]>Arr[i],并且i-k值最小(即最靠近)。

     要求O(n)时间内找出Arr中所有元素对应的Arr[k]的位置。

     ex,

     src[]: 9, 5, 2, 4, 7

     dst[]: -1,0, 1, 1, 0

 

思路:

     借助于栈来实现,从后向前遍历数组,while栈顶元素小于当前遍历的数组元素,则更新dst,并pop。

参见下面代码

 

/*
题目:
给定数组Arr
,对于其中的每个元素Arr[i](0=<i<n),
在Arr[0...i-1]中找到元素Arr[k],Arr[k]满足Arr[k]>Arr[i],并且i-k值最小(即最靠近)。
要求O(n)时间内找出Arr中所有元素对应的Arr[k]的位置。

ex,
src[]: 9, 5, 2, 4, 7
dst[]: -1,0, 1, 1, 0
思路:

借助于栈来实现,从后向前遍历数组,while栈顶元素小于当前遍历的数组元素,则更新dst,并pop。
*/

#include <iostream>
#include <stack>
using namespace std;

void sulotion(const int* src,int* dst,const int nSize)
{
stack<int> temp;
for ( int i=nSize-1 ; i>=0 ;  ){
if ( !temp.empty() && src[i]>src[temp.top()] ){
dst[temp.top()]=i;
temp.pop();
} else {
temp.push(i);
--i;
}
}
while (!temp.empty()){
dst[temp.top()]=-1;
temp.pop();
}
}

int main()
{
int src[] = {2,9, 5, 2, 4, 7};
int dst[6];
sulotion(src,dst,6);
for ( int i=0 ; i<6 ; ++i ){
cout<<dst[i]<<"  ";
}
return 0;
}


 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐