
image.png
题目1:由于只包含字符的字符串'(',')','{','}','['和']',确定输入字符串是有效的。
原题:https://leetcode.com/problems/valid-parentheses/
public static void main(String[] args) {
System.out.println(validate("([{}])"));//true
System.out.println(validate("]()["));//false
System.out.println(validate("(()"));//false
}
public static boolean validate(String a){
Map<String,String> map = new HashMap<>();//定一个map,用右边的括号做key,巧妙来判断
map.put(")","(");
map.put("]","[");
map.put("}","{");
Stack stock = new Stack<>();
for(char c : a.toCharArray()){
if(!map.containsKey(String.valueOf(c))){//如果不在所有都key当中,说明是左括号,直接放入栈,比如是( [ { ,合法的
stock.push(c);
}else if(stock.isEmpty()){//如果栈为空,代表第一次的if没有进去,说明是右括号,直接不合法,比如) ] }
return false;
}else {
String s = map.get(String.valueOf(c));
Object pop = stock.pop();
System.out.println(s + "=" + pop);
if (!s.equals(pop.toString())) {//从栈顶取出一个,与本次右括号对应的左括号相比,如果不相等,代表不合法,比如 栈顶的值是[,本次右括号是)
return false;
}
}
//其中第二个elseif和第三个else 可以合并到一个else if语句
}
return stock.isEmpty();//如果栈为空,代表合法
}
题目2:如何用栈来实现队列都效果 题目序号:232 225
原题:https://leetcode.com/problems/implement-queue-using-stacks/
比如栈存入 1 -> 2 -> 3 进去,要按 1 -> 2 -> 3 出来
思路可以是用两个栈,第一个栈依次push数据,第二个栈push第一个栈pop的数据,这样取数据都时候直接从第二个栈取数据,相当于队列都先入先出效果了,如果第二个栈没读取完,又来了新数据 4、5、6,第一个栈还是老样子依次push数据,但是要等第二个栈pop完成(第二个栈为空时)才再次push第一个栈pop的数据
优先队列
Java我们一般用mini heap和max heap 实现

image.png

image.png
题目3:设计一个类来查找流中第k个最大元素。请注意,它是排序顺序中的第k个最大元素,而不是第k个不同元素
原题:https://leetcode.com/problems/kth-largest-element-in-a-stream/
思路,使用优先队列的方式,我们考虑用最小堆(min heep)这个数据结构解决,它的特点是最小值放在上面
class Wei {
int k;
PriorityQueue<Integer> minheap;
public Wei(int k, int[] nums) {
minheap = new PriorityQueue<>(k);
this.k = k;
for(int num: nums) {
minheap.offer(num);
if(minheap.size() > k) {
minheap.poll();//把最小的去掉,只保留k个数
}
}
}
public int add(int val) {
if(minheap.size() < k){//如果堆的数据不足k个,直接insert
minheap.offer(val);
}else if(minheap.peek() < val) {//如果读取出来(这里只是读取,没有remove)的最小值<当前值,把原来的最小值poll,放入当前这个值
minheap.poll();
minheap.offer(val);
}
return minheap.peek();
}
public static void main(String[] args) {
int [] nums = {1,2,4,6,8};
Wei item = new Wei(3,nums);
System.out.println(item.minheap);
System.out.println(item.add(5));
System.out.println(item.minheap);
System.out.println(item.add(10));
System.out.println(item.minheap);
}
}