[英]Find the minimal value in stack with recursion
我需要在堆棧中遞歸地找到最小值,然后返回最小值......我嘗試迭代解決它並且它起作用了。
我的遞歸嘗試:
import java.util.Scanner;
public class Main {
public static int minimalValue(Stack<Integer> s, int min) {
if (s.isEmpty())
return min;
// Save the previous value.
int prev = s.pop();
if (!s.isEmpty() && prev < min)
min = prev;
return minimalValue(s, min);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Stack<Integer> stack = new Stack<Integer>();
stack.push(99);
stack.push(64);
stack.push(73);
stack.push(54);
stack.push(100);
stack.push(82);
stack.push(55);
stack.push(300);
System.out.println(minimalValue(stack, stack.top()));
in.close();
}
}
如您所見,在方法完成后,堆棧中的每個元素都被刪除了。 你能給我一個更好的解決方案嗎?
您可以按如下方式保留原始Stack
:
public static int minimalValue(Stack<Integer> s) {
if (s.isEmpty())
return Integer.MAX_VALUE;
int last = s.pop();
int min = Math.min(last, minimalValue(s));
s.push(last);
return min;
}
這種遞推通過觀察在最小值創建Stack
是頂部之間的最小Stack
和最小值的Stack
通過去除的頂部得到的Stack
。
通過在每次遞歸調用后添加彈出元素,我確保Stack
最終返回其原始狀態。
請注意,此解決方案不需要將第二個參數傳遞給遞歸方法。
測試:
Stack<Integer> stack = new Stack<Integer>();
stack.push(99);
stack.push(64);
stack.push(73);
stack.push(54);
stack.push(100);
stack.push(82);
stack.push(55);
stack.push(300);
System.out.println(minimalValue(stack));
System.out.println (stack);
輸出:
54
[99, 64, 73, 54, 100, 82, 55, 300]
如您所見, Stack
最終包含其所有元素。
這可能被認為是作弊,但您可以通過克隆它並在克隆上操作來避免修改原始堆棧。
import java.util.Optional;
import java.util.Stack;
class Scratch {
public static Optional<Integer> minimalValue(Stack<Integer> s, Optional<Integer> min) {
if (s.empty()) {
return min;
}
Integer topElement = s.pop();
Integer newMin = Math.min(topElement, min.orElse(topElement));
return minimalValue(s, Optional.of(newMin));
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(99);
stack.push(64);
stack.push(73);
stack.push(54);
stack.push(100);
stack.push(82);
stack.push(55);
stack.push(300);
Stack<Integer> clone = (Stack) stack.clone();
Optional<Integer> result = minimalValue(clone, Optional.empty());
System.out.println(result.orElse(null));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.