参考:http://blog.youkuaiyun.com/yysdsyl/article/details/5419149
题目:
给定数组Arr[n],对于其中的每个元素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[n],对于其中的每个元素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;
}