AcWing第74场周赛+Leetcode第316场周赛补题

博客对AcWing第74场周赛和Leetcode第316场周赛补题进行分析。AcWing周赛涉及最小身高差和立方体问题,分别用遍历数组和深搜解决;Leetcode周赛补题包括判断事件冲突和求最大公因数等于K的子数组数目,通过时间转换和双指针遍历求解。

AcWing第74场周赛

第一题:AcWing 4707. 最小身高差 - AcWing

分析:遍历身高数组a[N],用一个数组b[N]存储a[N]中前后两个元素的差的绝对值,最后再将第n个和第一个同学的身高差额外加进去即可。

代码实现:

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

const int N = 1010;
int a[N],b[N];
int n;

int main(){
    scanf("%d", &n);
    for(int i = 0;i < n;i ++){
        scanf("%d",&a[i]);
    }
    for(int i = 0;i < n - 1;i ++){
        b[i] = abs(a[i] - a[i + 1]);
    }
    b[n - 1] = abs(a[n - 1] - a[0]);
    sort(b,b + n);
    printf("%d",b[0]);
    return 0;
}

第二题:AcWing 4708. 立方体 - AcWing

分析:深搜模板题,只不过从二维的变成了三维的。一共要定义六个方向的偏移量,每遍历一个格子就标记成"#"障碍物,表示已经走过,以免下次一次递归是重复走到该格子

代码实现:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 15;

int n, m, k;
char g[N][N][N];

//六个方向的偏移量
int dx[] = {1, 0, 0, -1, 0, 0};
int dy[] = {0, 1, 0, 0, -1, 0};
int dz[] = {0, 0, 1, 0, 0, -1};

int dfs(int x, int y, int z)
{
    g[x][y][z] = '#';//没遍历一个格子标记一下,表示已经走过了
    int res = 1;

    //枚举六个方向
    for (int i = 0; i < 6; i ++ )
    {
        int a = x + dx[i], b = y + dy[i], c = z + dz[i];
        if (a < 0 || a >= n || b < 0 || b >= m || c < 0 || c >= k)//检测是否越界
            continue;
        if (g[a][b][c] == '#') continue;
        
        //既没有越界也没有障碍物才递归遍历这个格子
        res += dfs(a, b, c);
    }

    return res;
}

int main()
{
    cin >> n >> m >> k;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            cin >> g[i][j];

    int y, z;//读入起点和终点
    cin >> y >> z;

    cout << dfs(0, y - 1, z - 1) << endl;

    return 0;
}

Leetcode第316场周赛补题

第一题:2446. 判断两个事件是否存在冲突

分析:可以将每个开始时刻和结束时刻表示为从00:00开始的时间段的分钟的形式,然后再分别比较大小,如果事件1 starttime  >= 事件2的 endtime ,或者工作2的 starttime 迟于工作1的 endtime 则表示两事件之间不存在冲突,输出false,否则返回true。

代码实现:

class Solution {
public:
    bool haveConflict(vector<string>& event1, vector<string>& event2) {
        int s1,e1,s2,e2;
        s1 = (event1[0][0] - '0') * 600 + (event1[0][1] - '0') * 60 + (event1[0][3] - '0') * 10 + (event1[0][4] - '0');//事件1开始时间
        e1 = (event1[1][0] - '0') * 600 + (event1[1][1] - '0') * 60 + (event1[1][3] - '0') * 10 + (event1[1][4] - '0');//事件1结束时间
        s2 = (event2[0][0] - '0') * 600 + (event2[0][1] - '0') * 60 + (event2[0][3] - '0') * 10 + (event2[0][4] - '0');//事件2开始时间
        e2 = (event2[1][0] - '0') * 600 + (event2[1][1] - '0') * 60 + (event2[1][3] - '0') * 10 + (event2[1][4] - '0');//事件2结束时间
        if(s1 > e2||s2 > e1)return false;
        else return true;        
    }
};

第二题:2447. 最大公因数等于 K 的子数组数目 - 力扣(LeetCode)

分析:利用双指针遍历数组和计数,不过内存和时间都不强。左指针指向每个子数组的起始位置,右指针右移过程中加上条件判断,若左指针指向的值就为k的话,cnt ++。在右指针往后移动过程中,需要用一个整型变量a维护右指针前的一个数nums[ i ],判断a与右指针所指元素的最大公因数是否为k,是的话就cnt ++,然后每次循环更新一遍a。

代码实现:

class Solution {
public:
    int subarrayGCD(vector<int>& nums, int k) {
        int cnt = 0;

        for(int i = 0;i < nums.size();i ++){
            if(nums[i] == k) cnt ++;
            int a = nums[i];
            for(int j = i + 1;j < nums.size();j ++){
                a = gcd(nums[j],a);
                if(gcd(nums[j],a) == k){
                    cnt ++;
                }
            }
        }
        return cnt;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值