我试图找到每个元素左侧的最大元素,但我只能为第一个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);
}
Using Stack
public static int[] maxLeftElement(int[] A)
{
final int n = A.length;
int[] ans = new int[n];
Stack<Integer> S = new Stack<>();
S.push(A[0]);
for (int i = 0;i < n;i++)
{
if (S.peek() <= A[i])
{
S.pop();
S.push(A[i]);
}
ans[i] = S.peek();
}
return ans;
}
有效解
在上面的解决方案中,在整个函数执行过程中,堆栈中只有一个元素。因此,很明显,栈并没有提供任何好处。因此,最好将其替换为简单的int
。
public static int[] maxLeftElement(int[] A)
{
final int n = A.length;
int[] ans = new int[n];
int maxSoFar = A[0];
for (int i = 0;i < n;i++)
{
maxSoFar = Math.max(maxSoFar,A[i]);
ans[i] = maxSoFar;
}
return ans;
}
直觉对于每个A[i]
,我们必须找到max(A[0..i])
,对于所有有效的i。如果我们考虑可能的元素,A[0..i]
中可能只有一个最大元素。
现在,设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])
。
为什么不堆叠?
当需要以特定顺序存储多个元素时,应该使用Stack,这可以帮助我们计算任何A[i]
的答案。我们不需要在任何时刻跟踪多个元素来获得问题中任何A[i]
的答案。这就排除了使用stack的可能性。