Đề bài
Một generic Stack<T> hoạt động với mọi kiểu. Ở đây bạn mở rộng ý tưởng đó: một stack các số nguyên cũng có thể báo cáo giá trị nhỏ nhất của nó trong thời gian hằng số.
Xử lý các operations theo thứ tự:
push <x>: đẩy x vào stack.pop: xóa giá trị trên cùng (bỏ qua khi stack rỗng).min: báo cáo giá trị nhỏ nhất hiện có trong stack, hoặc -1 nếu stack rỗng.
Implement min_stack_operations(operations).
Input
operations: Các operations.
Output
Trả về các câu trả lời của các min operations, theo thứ tự.
Ràng buộc
1 ≤ số thao tác ≤ 200,000
0 ≤ x ≤ 10^9
Ví dụ
Đầu vào:
operations = ["push 5", "push 3", "min", "pop", "min"]
Kết quả mong đợi:
expected = [3, 5]
Đầu vào:
std::vector<std::string> operations = {"push 5", "push 3", "min", "pop", "min"};
Kết quả mong đợi:
std::vector<long long> expected = {3, 5};
Đầu vào:
string[] operations = new string[] {"push 5", "push 3", "min", "pop", "min"};
Kết quả mong đợi:
long[] expected = new long[] {3, 5};
Giải thích
Với 5 và 3 trên stack thì giá trị nhỏ nhất là 3. Sau khi pop 3, chỉ còn 5: [3, 5].
Đầu vào:
operations = ["min", "pop", "push 7", "min"]
Kết quả mong đợi:
expected = [-1, 7]
Đầu vào:
std::vector<std::string> operations = {"min", "pop", "push 7", "min"};
Kết quả mong đợi:
std::vector<long long> expected = {-1, 7};
Đầu vào:
string[] operations = new string[] {"min", "pop", "push 7", "min"};
Kết quả mong đợi:
long[] expected = new long[] {-1, 7};
Giải thích
Stack rỗng trả về -1 và pop bị bỏ qua; sau đó giá trị nhỏ nhất là 7: [-1, 7].
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Cạnh mỗi giá trị, lưu giá trị nhỏ nhất của ngăn xếp tại thời điểm đó.
Gợi ý 2
Khi đó giá trị nhỏ nhất hiện tại chính là đỉnh của ngăn xếp thứ hai.
Gợi ý 3
Bỏ qua pop khi ngăn xếp rỗng, và trả -1 cho min khi rỗng.
Độ phức tạp mong đợi
thời gian O(số thao tác), bộ nhớ phụ O(số thao tác)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.