B站左程云算法视频中级班05

题目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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值