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

时间:2022-06-04 17:15:33

参考: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;
}