记录一下2022leetcode秋季赛

    记录一下小菜鸡今天下午的秋季赛,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<int>& temperatureA, vector<int>& temperatureB) {
        vector<int> 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<vector<int>>& path) {
        map<int, int> st1, st2;
        set<int> 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<vector<int>> ballGame(int num, vector<string>& 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<string>& 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<int> 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<vector<int>> res;
};

    第四题第五题没做出来,还是太菜了,还是要继续努力呀!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZzBoAYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值