参考:http://blog.csdn.net/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; }