[杨小白]_leetcode_中国银联专场竞赛-第三题

216 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

中国银联专场竞赛(2023届校园招聘专场)

中国银联专场竞赛(2023届校园招聘专场)-力扣

这个比赛当时没看到,参加的人不多,后来自己做发现并不难,四题都能a了,咱就分三期讲讲这四个题啦。

银联-3. 风能发电

现有一座风力发电场和容量 storeLimit 的储能站,第 j 条供电指令 supply[j]=[time, minSupply, maxSupply] 表示时刻 time 起(包含该时刻)每一时刻最少供应电能 minSupply 以及最多供应电能 maxSupply,直至后续指令调整。

在时刻 i 发电量为 power[i],该时刻供电逻辑如下:

  • 若发电量在 [minSupply, maxSupply] 范围内,则均供应负载;

  • 若发电量大于 maxSupply,则超出部分存入储能站,存储量至多不超过 storeLimit

  • 若发电量小于 minSupply,则由储能站补充缺少电量,最多不超过当前存储量;

    注:储能站补充电量,直至剩余存储电量为 0

请返回最后时刻(即时刻 power.length-1)储能站中能源总量。

注意:

  • 输入用例保证供电指令的 time 严格递增且第 0 个指令的 time = 0
  • 储能电站初始存储电量为 0

示例 1

输入:
storeLimit = 10
power = [1,3,4,3,6]
supply = [[0,2,3]]

输出: 4

解释:
时刻 0,供能 1, 新增储能 0, 总储能 0
时刻 1,供能 3, 新增储能 0, 总储能 0
时刻 2,供能 3, 新增储能 1, 总储能 1
时刻 3,供能 3, 新增储能 0, 总储能 1
时刻 4,供能 3, 新增储能 3, 总储能 4
因此最后时刻,剩余的能源总量为 4

示例 2

输入:
storeLimit = 6
power = [6,5,2,1,0]
supply = [[0,1,2],[2,3,3]]

输出: 0

解释:
时刻 0,供能 2, 新增储能 4, 总储能 4
时刻 1,供能 2, 新增储能 2, 总储能 6 (由于储能电站达上限,电量 1 丢弃)
时刻 2,供能 3, 新增储能 -1, 总储能 5
时刻 3,供能 3, 新增储能 -2, 总储能 3
时刻 4,供能 3, 新增储能 -3, 总储能 0
因此最后时刻,剩余的能源总量为 0

提示

  • 1 <= storeLimit <= 10^6
  • 1 <= power.length <= 10^5
  • 0 <= power[i] <= 10^5
  • 1 <= supply.length <= power.length
  • 对于 i < j,满足 supply[i][0] < supply[j][0]
  • supply[i].length == 3
  • 0 <= supply[i][0] < power.length
  • 0 <= supply[i][1]<= supply[i][2] <= 10^5

代码

这个题的题干是真的长。。。。

但是理清楚业务逻辑就很简单了,相当于有一个store能储存能量,最大能存storeLimit,不难为负数

supply给出了每个时刻的最大max、最小min输出量,pow给出了每时的实际输出量

如果在某一个时刻,pow大于了max,那么多的能量就存到store去,但是不能超过storeLimit

如果pow小于了min,那就需要从store取出来一部分填补,但是不能小于0

class Solution {
    int maxStore;
    int curStore;
    public int storedEnergy(int storeLimit, int[] power, int[][] supply) {
        maxStore = storeLimit;
        curStore = 0;
        int supplyIndex = 0;
        int min = supply[0][1];
        int max = supply[0][2];
        for (int i = 0; i < power.length; i++) {
            if (supplyIndex < supply.length - 1 && i == supply[supplyIndex+1][0]) {
                supplyIndex++;
                min = supply[supplyIndex][1];
                max = supply[supplyIndex][2];
            }
            fun(power[i], min, max);
        }
        return curStore;
    }
    public void fun(int power, int min, int max) {
        if(power >= min && power <= max) {
            return;
        }
        if(power < min) {
            int dif = min - power;
            curStore = Math.max(0,curStore - dif);
        }
        if(power > max) {
            int dif = power - max;
            curStore = Math.min(maxStore, curStore + dif);
        }
    }
}

代码量很小,并且拆分出了fun函数,还是很好看懂的。骑宠curstore存的就是当前实际的存储量,最后也是要返回这个值。

算法不算快

image.png

第一、二题连接如下-银联-1. 重构链表-银联-2. 勘探补给

银联-1. 重构链表-银联-2. 勘探补给

第四题连接如下-银联-4. 设计自动售货机

银联-4. 设计自动售货机

3.结束

前两题都不难,基本100题量的同学就可以做出来了,这个题明白业务逻辑也是可以做出来的,基本刷个200题就能达到了,gogogo,刷题刷题,每天一道,三年1000道!!!!