持续创作,加速成长!这是我参与「掘金日新计划 · 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^61 <= power.length <= 10^50 <= power[i] <= 10^51 <= supply.length <= power.length- 对于
i < j,满足supply[i][0] < supply[j][0] supply[i].length == 30 <= supply[i][0] < power.length0 <= 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存的就是当前实际的存储量,最后也是要返回这个值。
算法不算快
第一、二题连接如下-银联-1. 重构链表-银联-2. 勘探补给
银联-1. 重构链表-银联-2. 勘探补给
第四题连接如下-银联-4. 设计自动售货机
银联-4. 设计自动售货机
3.结束
前两题都不难,基本100题量的同学就可以做出来了,这个题明白业务逻辑也是可以做出来的,基本刷个200题就能达到了,gogogo,刷题刷题,每天一道,三年1000道!!!!