题目1:实现一个特殊的栈,在实现栈的基本功能的基础上,再返回栈中最小元素的操作getMin
思路:搞两个栈,一个Data,一个Min,每次都在当前的最小值压入Min(谁小压谁)
题目二:栈结构实现队列结构;队列结构实现栈结构
两个栈,一个push,一个pop,pop没东西时,可以push进,pop栈一次倒完
public TwoStacksQueue(){
stackPush = new Stack<Integer>();
stackPop = new Stack<Integer>();
}
public void push(int pushInt){
stackPush.push(PushInt);
dao();
}
public int poll(){
if (stakcPop.empty() && stackPush.empty()){
throw new RuntimeException("Queue is empty!");
}
dao();
return stackPop.pop();
}
public int peek() {
if (stackPop.empty() && stackPush.empty()){
throw new RuntimeException("Queue is empty!");
}
dao();
return stackPop.peek();
}
public void dao(){
if (stackPop.isEmpty()){
while(!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
}
题目三:动态规划空间压缩技巧
题目四:(接雨水)
给定一个数组arr,已知其中所有的值都是非负的,将这个素组看作一个容器,请返回容器能装多少水。
思路:和洗衣机类似,只关注i位置自己上方能否存水
i = min(max(0,..,i-1),max(i,...,N))- i
[i] = max{ min(左max,右max) - arr[i],0}
双指针
哪侧的最大值大先结算哪侧,相等随意结算哪侧。
题目五:给定一个数组arr长度为N,你可以把任意长度大于0且小于N的前缀作为左部分,剩下的作为右部分。但是每种划分下都有左部分的最大值和右部分的最大值,请返回最大的,最部分最大值减去右部分最大值的绝对值。
先找到全局最大值max,如果max被划分进左边,则尽量让右部分的最大值尽量小,右部分>=最后一个数,所以为max-arr[N-1],max被划进右边,同理。。。
题目六:如果一个字符串为str,按字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。
str = "1 2 3 4 5"
生成一个字符串为str+str,看另一个串是不是他的子串
题目7:(咖啡问题)arr[3,2,7] 代表咖啡机的工作效率
N代表有多少人喝咖啡
a 洗杯子的机器洗一个杯子所要的时间
b 杯子不洗自然挥发变干净的时间
从所有人开始喝咖啡到最后一个杯子干净需要多长时间
思路: 两步走:1.选择什么顺序冲咖啡 小根堆(一维数据+二维数据排序)
//假设洗咖啡的机器在washline的时间才有空
//a洗咖啡的机器洗一杯的时间
//b咖啡杯自然挥发的时间
//如果要洗碗drinks[index...N-1],返回最早完成所有事情的时间点
public static int process(int[] drinks, int a, int b, int index, int washLine){
if (index == drinks.length - 1){
return Math.min(Math.max(washLine, drinks[index]) + a, drinks[index] + b);
}
//wash是我当前的咖啡杯,放到咖啡机里洗,洗完的时间
int wash = Math.max(washLine, drinks[index]) + a;
//洗完剩下所有的咖啡杯最早的结束时间
int next1 = process(drinks, a, b, index + 1, wash);
//需要做完所有的事情,所以包括我洗完的时间,和剩下咖啡杯洗完的最早时间
int p1 = Math.max(wash, next1);
//当前的杯子挥发
int dry = drinks[index] + b;
int next2 = process(drinks, a, b, index + 1, washLine);
int p2 = Math.max(dry, next2);
return Math.min(p1, p2);
}
题目七:给定一个数组,通过调整可以做到arr中任意两个相邻的数字相乘是4的倍数,返回true,否则返回false
首先遍历数组,分为 奇数(a个) 只有一个2因子的数(b个) 和 包含4因子的数(c个)
1)b==0 奇4奇4奇..... 最节省4因子数 a==1, c >=1 ; a != 1 c>= a - 1
2) b != 0 222222(b个)4奇4奇.... a == 0 c >= 0
a == 1 c >=1 a > 1 c >=a
b = 1, a = 0, c >=1