我试图找到每个元素左边的max元素,但是我只能为第一个max写代码。
public static void main(String[] args) {
int a[]={3,0,0,2,0,4};
Stack<Integer> st=new Stack<Integer>();
ArrayList<Integer> al=new ArrayList<>();
for(int i=0;i<5;i++){
while(st.size()>0 && a[st.peek()]<a[i]){
st.pop();
}
if(st.empty()) al.add(a[i]);
else al.add(a[st.peek()]);
st.push(i);
}
System.out.println(al);
}
1条答案
按热度按时间tjvv9vkg1#
使用堆栈
高效解决方案
在上面的解决方案中,在函数的整个执行过程中,堆栈中只有一个元素。因此,很明显,堆栈没有提供任何好处。因此,最好用简单的
int
来替换它。直觉
对于每个
A[i]
,我们必须找到所有有效 i 的max(A[0..i])
,如果考虑可能的元素,A[0..i]
中可能只有一个max元素。现在,令
A[0..i]
中的最大元素为maxSoFar
,我们需要找到A[i+1]
的最大左元素,即max(A[0...i+1])
,简单地说,max(A[0..i+1]) = max(A[0...i],A[i+1]) = max(maxSoFar,A[i+1])
可以在常数时间内求解。我们已经知道
A[0]
的最大左元素是A[0]
,所以,最初是maxSoFar = A[0]
,因此,我们可以简单地为所有有效值不断增加i,并计算max(maxOfFar,A[i])
。为什么不堆叠?
当需要以特定的顺序存储许多元素时,应该使用堆栈,这可以帮助我们计算任何
A[i]
的答案。我们不需要在任何时刻跟踪多个元素来获得任何A[i]
的答案。这排除了使用堆栈的可能性。