记录一下小菜鸡今天下午的秋季赛,ac了3题,第四题没转过来弯,没做出来,至于第五题看了一眼就没动。。。还是要好好学呀
第一题:
LCP 61. 气温变化趋势
力扣城计划在两地设立「力扣嘉年华」的分会场,气象小组正在分析两地区的气温变化趋势,对于第 i ~ (i+1) 天的气温变化趋势,将根据以下规则判断:
若第 i+1 天的气温 高于 第 i 天,为 上升 趋势
若第 i+1 天的气温 等于 第 i 天,为 平稳 趋势
若第 i+1 天的气温 低于 第 i 天,为 下降 趋势
已知 temperatureA[i] 和 temperatureB[i] 分别表示第 i 天两地区的气温。
组委会希望找到一段天数尽可能多,且两地气温变化趋势相同的时间举办嘉年华活动。请分析并返回两地气温变化趋势相同的最大连续天数。即最大的 n,使得第 i~i+n 天之间,两地气温变化趋势相同
示例 1:
输入:
temperatureA = [21,18,18,18,31]
temperatureB = [34,32,16,16,17]输出:2
解释:如下表所示, 第 2~4 天两地气温变化趋势相同,且持续时间最长,因此返回 4-2=2
示例 2:输入:
temperatureA = [5,10,16,-6,15,11,3]
temperatureB = [16,22,23,23,25,3,-16]输出:3
提示:
2 <= temperatureA.length == temperatureB.length <= 1000
-20 <= temperatureA[i], temperatureB[i] <= 40来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/6CE719
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一题还是很简单的,用一个循环对比每天的趋势,然后找到最长得保持时间。
class Solution {
public:
int temperatureTrend(vector& temperatureA, vector& temperatureB) {
vector cA(temperatureA.size()-1), cB(temperatureB.size()-1);
int res = 0, temp = 0;
for (int i = 0; i < cA.size(); ++i){
if (temperatureA[i+1] - temperatureA[i] > 0) cA[i] = 1;
else if (temperatureA[i+1] - temperatureA[i] < 0) cA[i] = -1;
else cA[i] = 0;
if (temperatureB[i+1] - temperatureB[i] > 0) cB[i] = 1;
else if (temperatureB[i+1] - temperatureB[i] < 0) cB[i] = -1;
else cB[i] = 0;
if (cA[i] == cB[i]) temp++;
else{
if (temp > res) res = temp;
temp = 0;
}
}
if (temp > res) res = temp;
return res;
}
};
第二题:
LCP 62. 交通枢纽
为了缓解「力扣嘉年华」期间的人流压力,组委会在活动期间开设了一些交通专线。path[i] = [a, b] 表示有一条从地点 a通往地点 b 的 单向 交通专线。
若存在一个地点,满足以下要求,我们则称之为 交通枢纽:所有地点(除自身外)均有一条 单向 专线 直接 通往该地点;
该地点不存在任何 通往其他地点 的单向专线。
请返回交通专线的 交通枢纽。若不存在,则返回 -1。注意:
对于任意一个地点,至少被一条专线连通。
示例 1:输入:path = [[0,1],[0,3],[1,3],[2,0],[2,3]]
输出:3
解释:如下图所示:
地点 0,1,2 各有一条通往地点 3 的交通专线,
且地点 3 不存在任何通往其他地点的交通专线。
示例 2:输入:path = [[0,3],[1,0],[1,3],[2,0],[3,0],[3,2]]
输出:-1
解释:如下图所示:不存在满足 交通枢纽 的地点。
提示:1 <= path.length <= 1000
0 <= path[i][0], path[i][1] <= 1000
path[i][0] 与 path[i][1] 不相等来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/D9PW8w
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题用两个map来存储出发点和到达点出现的地点与次数,然后用一个set来存储出现过的地点(set插入倒是不浪费时间,感觉有点浪费空间,当时看一眼数据大小感觉还行就这么做了没想着优化),然后循环到达点的map,找没在出发点出现过的到达点,然后判断是否是其他所有点的到达点。
class Solution {
public:
int transportationHub(vector>& path) {
map st1, st2;
set s;
for (int i = 0; i < path.size(); ++i){
st1[path[i][0]]++;
st2[path[i][1]]++;
s.insert(path[i][0]);
s.insert(path[i][1]);
}
for (auto it = st2.begin(); it != st2.end(); ++it){
cout << it->first << ' ';
if (st1.find(it->first) == st1.end())
if(it->second == s.size()-1) return it->first;
}
return -1;
}
};
第三题:
LCP 63. 弹珠游戏
欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的弹珠游戏。
N*M 大小的弹珠盘的初始状态信息记录于一维字符串型数组 plate 中,数组中的每个元素为仅由 "O"、"W"、"E"、"." 组成的字符串。其中:
"O" 表示弹珠洞(弹珠到达后会落入洞中,并停止前进);
"W" 表示逆时针转向器(弹珠经过时方向将逆时针旋转 90 度);
"E" 表示顺时针转向器(弹珠经过时方向将顺时针旋转 90 度);
"." 表示空白区域(弹珠可通行)。
游戏规则要求仅能在边缘位置的 空白区域 处(弹珠盘的四角除外)沿 与边缘垂直 的方向打入弹珠,并且打入后的每颗弹珠最多能 前进 num 步。请返回符合上述要求且可以使弹珠最终入洞的所有打入位置。你可以 按任意顺序 返回答案。注意:
若弹珠已到达弹珠盘边缘并且仍沿着出界方向继续前进,则将直接出界。
示例 1:输入:
num = 4
plate = ["..E.",".EOW","..W."]输出:[[2,1]]
解释:
在 [2,1] 处打入弹珠,弹珠前进 1 步后遇到转向器,前进方向顺时针旋转 90 度,再前进 1 步进入洞中。
示例 2:输入:
num = 5
plate = [".....","..E..",".WO..","....."]输出:[[0,1],[1,0],[2,4],[3,2]]
解释:
在 [0,1] 处打入弹珠,弹珠前进 2 步,遇到转向器后前进方向逆时针旋转 90 度,再前进 1 步进入洞中。
在 [1,0] 处打入弹珠,弹珠前进 2 步,遇到转向器后前进方向顺时针旋转 90 度,再前进 1 步进入洞中。
在 [2,4] 处打入弹珠,弹珠前进 2 步后进入洞中。
在 [3,2] 处打入弹珠,弹珠前进 1 步后进入洞中。
示例 3:输入:
num = 3
plate = [".....","....O","....O","....."]输出:[]
解释:
由于弹珠被击中后只能前进 3 步,且不能在弹珠洞和弹珠盘四角打入弹珠,故不存在能让弹珠入洞的打入位置。提示:
1 <= num <= 10^6
1 <= plate.length, plate[i].length <= 1000
plate[i][j] 仅包含 "O"、"W"、"E"、"."来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/EXvqDp
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题是真恶心,判断条件不写全,除了题目中的不要再弹珠洞和弹珠盘四角打入外,如果在在弹珠打入的时候点为W或E时,也是一个失败条件,其他的就是规规矩矩的从四个方向打入弹珠:
class Solution {
public:
vector> ballGame(int num, vector& plate) {
// 从整体的左侧进入 方向向右
for (int i = 1; i < plate.size()-1; ++i) {
if (plate[i][0] == '.')
findO(num, plate, i, 0, i, 0, 1);
}
// 从整体的下侧进入,方向向上
for (int j = 1; j < plate[0].size()-1; ++j) {
if (plate[plate.size()-1][j] == '.')
findO(num, plate, plate.size()-1, j, plate.size()-1, j, 0);
}
// 从整体的右侧进入,方向向左
for (int i = 1; i < plate.size()-1; ++i) {
if (plate[i][plate[0].size()-1] == '.')
findO(num, plate, i, plate[0].size()-1, i, plate[0].size()-1, 3);
}
// 从整体的上侧进入,方向向下
for (int j = 1; j < plate[0].size()-1; ++j) {
if (plate[0][j] == '.')
findO(num, plate, 0, j, 0, j, 2);
}
return res;
}
// fx表示方向 0为上 1为右 2为下 3为左
void findO(int num, vector& plate, int bx, int by, int x, int y, int fx){
if (x < 0 || y < 0 || x >plate.size()-1 || y > plate[0].size()-1 || num < 0) return;
if (plate[x][y] == 'O'){
vector temp; temp.push_back(bx); temp.push_back(by);
res.push_back(temp);
return;
}
else if (num == 0){
return;
}else if (plate[x][y] == '.'){
if (fx == 0) x--;
else if (fx == 1) y++;
else if (fx == 2) x++;
else y--;
}else if (plate[x][y] == 'E'){
if (fx == 0){ fx = 1; y++;
}else if (fx == 1){ fx = 2; x++;
}else if (fx == 2){ fx = 3; y--;
}else { fx = 0; x--; }
}else if (plate[x][y] == 'W'){
if (fx == 0){ fx = 3; y--;
}else if (fx == 1){ fx = 0; x--;
}else if (fx == 2){ fx = 1; y++;
}else { fx = 2; x++; }
}
findO(num-1, plate, bx, by, x, y, fx);
}
private:
vector> res;
};
第四题第五题没做出来,还是太菜了,还是要继续努力呀!