今天完成的是最小栈和有效括号的题
最小栈要求是完成一个支持push top pop操作的,并能在常数时间内完成检索最小元素的栈。
支持push top pop操作的栈并不难,但是常数级的查找是很困难的。通常的查找都是需要先排序,冒泡、插入和选择排序时间复杂度都是n2,快排的平均时间复杂度是logn。如果我们靠排序然后来选择最小是非常困难的。
因此在这种情况下,可以考虑空间换时间。增加一个额外的栈,保存最小元素的值。具体的代码如下:
```
import java.util.Stack;
public class MinStack {
private Stack<Integer> data;
private Stack<Integer> mindata;
public MinStack(){
data=new Stack<Integer>();
mindata=new Stack<Integer>();
}
public void push(int x){
data.push(x);
if (mindata.empty() || mindata.peek()>=x){
mindata.push(x);
}
}
public void pop(){
if (mindata.peek()==data.peek()){
mindata.pop();
}
data.pop();
}
public int top(){
return data.peek();
}
public int getMin(){
return mindata.peek();
}
}
```
有效括号就是给定一个字符串是由六个字符组合而成的。({[]})如果是左右括号能对的上就返回true,否则返回false。代码如下:
```
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
boolean flag=false;
Stack<Character> stack=new Stack<>();
Map<Character,Character> map=new HashMap<>();
map.put('[',']');
map.put('(',')');
map.put('{','}');
if (s.length()%2!=0){
return flag;
}
for (int i = 0; i <s.length() ; i++) {
Character c=s.charAt(i);
if (stack.empty() || map.get(stack.peek())!=c){
stack.push(c);
}else if (map.get(stack.peek())==c){
stack.pop();
}
}
if (stack.empty()){
flag=true;
}else {
flag=false;
}
return flag;
}
}
```