基础
思路:万物进循环或
数据结构
Stack
常用方法:
peek:查看堆栈顶部的对象,但不从堆栈中移除它
empty:测试堆栈是否为空
pop:移除堆栈顶部的对象,并作为此函数的值返回该对象。
push:把项压入堆栈顶部
LinkedList (Queue)
常用方法:
add:链表末尾添加元素
get:返回指定位置的元素
peek:返回第一个元素
poll:删除并返回第一个元素
size:返回链表元素个数
算法
栈和队列
只用递归和栈操作逆序一个栈
public static int getAndRemovelas(Stack<Integer> stack){int result= stack.pop();
if (stack. isEmpty( ))
return result;
else{
int last getAndRemoveLastElement(stack)
stack. push(result);
return last;
}
}
public static void reverse (Stack<Integer> stack){
if(stack. isEmpty()){
return;
}
int i= getAndRemoveLastElement(stack);
reverse(stack);
stack. push(i);
}
汉诺塔问题
/
/递归解法
public static int hanoiProbleml(int num, String left, String mid, String right){
if (num==1){
return 0;
}
return process(num, left, mid, right, left, right);
}
public static int process (int num, String left, String mid, String right, String from, String to){
//跳出标志
if (num ==1){
if(from.equals(mid)||to.equals(mid)){
System.out. println("move 1 from "+from+" to "+to);
return 1;
}else{
System.out. println("Move 1 from "+from+" to "+mid);
System.out. println("move 1 from "+mid+" to "+to);
return 2;
}
}
if (from. equals (mid)|| to. equals(mid)){
String another =(from. equals (left) ||to.equals (left))? right: left;
int part1 = process(num -1, left, mid, right, from, another);
int part2 =1;
System.out. println("move "+num+" from "+from+" to "+to);
int part3 =process(num-1, left, mid, right, another, to);
return part1+part2+part3;
}else{
int part1=process(num-1, left, mid, right, from, to);
int part2=1;
System.out.println("move "+num+" from"+from+" to "+mid);
int part3 =process(num -1 ,left, mid, right, to, from);
int part4=1;
System.out.println("move "+num+" from"+mid+" to "+to);
int part5= process(num-1, left, mid, right, from, to);
return part1+part2+part3+part4+part5;
}
}
数据结构解法
本题的关键在于利用双端队列来实现窗口最大值的更新。首先生成双端队列qmax,
qmax中存放数组arr中的下标。
假设遍历到arr[i],qmax的放入规则为:
1.如果qmax为空,直接把下标i放进qmax,放入过程结束。
2.如果qmax不为空,取出当前qmax队尾存放的下标,假设为j
1)如果arrj>arr[i,直接把下标i放进qma的队尾,放入过程结束。
2)如果arri<arr[i,把j从qmax中弹出继续qmax的放入规则
也就是说,如果qmax是空的,就直接放入当前的位置。如果qmax不是空的,qmax队尾的位置所代表的值如果不必当前的值大,将一直弹出队尾位置,直到比当前值大,当前的位置才放入队尾。
假设遍历到arr[i,qmax的弹出规则为:
如果qmax队头的下标等于i-w,说明当前qmax队头的下标已过期,弹出当前对头的
下标即可。
#单调栈结构
给定一个数组,求出数组中每一个数字位置局左边和右边距离最近小于这个数的值,没有-1
思路,需要一个栈顶到栈底严格递减的栈 用来存放数组的位置