LeetCode 362 期周赛

2023-09-13 21:26:15

在这里插入图片描述

8029.与车相交的点

题目:

给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] = [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。

返回数轴上被车 任意部分 覆盖的整数点的数目。
在这里插入图片描述

思路:

模拟

代码

class Solution {
public:
    int numberOfPoints(vector<vector<int>>& nums) {
        int flage[105]={0};
        int len1=nums.size();
        int sum=0;
        for(int i=0;i<nums.size();++i){
            for(int j=nums[i][0];j<=nums[i][2];++j){
                if(!flage[j]){
                    flage[j]=1;
                    sum++;
                }
            }
        }
            return sum;
    }
};

8049.判断能否在给定时间到达单元格

题目
给你四个整数 sx、sy、fx、fy 以及一个 非负整数 t 。

在一个无限的二维网格中,你从单元格 (sx, sy) 开始出发。每一秒,你 必须 移动到任一与之前所处单元格相邻的单元格中。

如果你能在 恰好 t 秒 后到达单元格 (fx, fy) ,返回 true ;否则,返回 false 。

单元格的 相邻单元格 是指该单元格周围与其至少共享一个角的 8 个单元格。你可以多次访问同一个单元格。

示例 1:

在这里插入图片描述

输入:sx = 2, sy = 4, fx = 7, fy = 7, t = 6
输出:true
解释:从单元格 (2, 4)开始出发,穿过上图标注的单元格,可以在恰好 6 秒后到达单元格 (7, 7) 。

示例 2:

在这里插入图片描述

输入:sx = 3, sy = 1, fx = 7, fy = 3, t = 3
输出:false
解释:从单元格 (3, 1)开始出发,穿过上图标注的单元格,至少需要 4 秒后到达单元格 (7, 3) 。因此,无法在 3 秒后到达单元格 (7, 3) 。

思路

只需求出起点到终点的最短时间即可,只要大于大于等于最短时间,都符合题意(可以绕圈圈)。值得注意的是,当起点和终点重合时,t不能是1。需要特殊判断。

代码

class Solution {
public:
    bool isReachableAtTime(int sx, int sy, int fx, int fy, int t) {
        if(sx==fx && sy==fy){
            if(t==1)
                return false;
        }

        int heng=abs(sx-fx);
        int lie=abs(sy-fy);
        int max_ans=heng+lie;
        int min_ans=max(heng,lie);
        if(t>=min_ans ){
            return true;
        }else{
            return false;
        }
    }
};

100030.将石头分散到网格图的最少移动次数

题目:

给你一个大小为 3 * 3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头,一个格子里可能会有 多个 石头。

每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。

请你返回每个格子恰好有一个石头的 最少移动次数 。

示例 1:
在这里插入图片描述

输入:grid = [[1,1,0],[1,1,1],[1,2,1]]
输出:3
解释:让每个格子都有一个石头的一个操作序列为:
1 - 将一个石头从格子 (2,1) 移动到 (2,2) 。
2 - 将一个石头从格子 (2,2) 移动到 (1,2) 。
3 - 将一个石头从格子 (1,2) 移动到 (0,2) 。
总共需要 3 次操作让每个格子都有一个石头。
让每个格子都有一个石头的最少操作次数为 3 。

示例 2:

在这里插入图片描述

输入:grid = [[1,3,0],[1,0,0],[1,0,3]]
输出:4
解释:让每个格子都有一个石头的一个操作序列为:
1 -将一个石头从格子 (0,1) 移动到 (0,2) 。
2 - 将一个石头从格子 (0,1) 移动到 (1,1) 。
3 - 将一个石头从格子 (2,2) 移动到 (1,2) 。
4 - 将一个石头从格子 (2,2) 移动到 (2,1) 。
总共需要 4次操作让每个格子都有一个石头。
让每个格子都有一个石头的最少操作次数为 4 。

思路:

DFS深度优先搜索

代码

class Solution {
public:
    int ans=INT_MAX;
    void dfs(vector<vector<int>>& full,vector<vector<int>>& less,int ans_temp,int number){
        if(number==less.size()){
            ans=min(ans,ans_temp);
            return;
        }
        for(int i=0;i<full.size();++i){
            if(full[i][7]>1){
                --full[i][8];
                dfs(full,less,ans_temp+abs(full[i][0]-less[number][0])+abs(full[i][9]-less[number][10]),number+1);
                ++full[i][11];
            }
        }

    }

    int minimumMoves(vector<vector<int>>& grid) {
        vector<vector<int>> full;
        vector<vector<int>> less;
        for(int i=0;i<3;++i){
            for(int j=0;j<3;++j){
                if(grid[i][j]>1){
                    //插入一个vector
                    full.push_back({i,j,grid[i][j]});
                }else if(grid[i][j]==0){
                    less.push_back({i,j,0});
                }
            }
        }
        dfs(full,less,0,0);
        return ans;
    }
};

8020.字符串转换

给你两个长度都为 n 的字符串 s 和 t 。你可以对字符串 s 执行以下操作:

将 s 长度为 l (0 < l < n)的 后缀字符串 删除,并将它添加在 s 的开头。 比方说,s = ‘abcd’
,那么一次操作中,你可以删除后缀 ‘cd’ ,并将它添加到 s 的开头,得到 s = ‘cdab’ 。 给你一个整数 k ,请你返回 恰好
k 次操作将 s 变为 t 的方案数。

由于答案可能很大,返回答案对 109 + 7 取余 后的结果。

在这里插入图片描述

思路

KMP + 矩阵快速幂优化 DP

代码

class Solution {
public:
    int numberOfWays(string s, string t, long long k) {
        int n = s.length();
        int c = kmp_search(s + s.substr(0, n - 1), t);
        vector<vector<long long>> m = {
            {c - 1, c},
            {n - c, n - 1 - c}
        };
        m = pow(m, k);
        return m[0][s != t];
    }

private:
    // KMP 模板
    vector<int> calc_max_match(string s) {
        vector<int> match(s.length());
        int c = 0;
        for (int i = 1; i < s.length(); i++) {
            char v = s[i];
            while (c && s[c] != v) {
                c = match[c - 1];
            }
            if (s[c] == v) {
                c++;
            }
            match[i] = c;
        }
        return match;
    }

    // KMP 模板
    // 返回 text 中出现了多少次 pattern(允许 pattern 重叠)
    int kmp_search(string text, string pattern) {
        vector<int> match = calc_max_match(pattern);
        int match_cnt = 0, c = 0;
        for (int i = 0; i < text.length(); i++) {
            char v = text[i];
            while (c && pattern[c] != v) {
                c = match[c - 1];
            }
            if (pattern[c] == v) {
                c++;
            }
            if (c == pattern.length()) {
                match_cnt++;
                c = match[c - 1];
            }
        }
        return match_cnt;
    }

    const long long MOD = 1e9 + 7;

    // 矩阵乘法
    vector<vector<long long>> multiply(vector<vector<long long>> &a, vector<vector<long long>> &b) {
        vector<vector<long long>> c(2, vector<long long>(2));
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD;
            }
        }
        return c;
    }

    // 矩阵快速幂
    vector<vector<long long>> pow(vector<vector<long long>> &a, long long n) {
        vector<vector<long long>> res = {{1, 0}, {0, 1}};
        for (; n; n /= 2) {
            if (n % 2) {
                res = multiply(res, a);
            }
            a = multiply(a, a);
        }
        return res;
    }
};
更多推荐

如何在JavaScript中实现链式调用(chaining)?

聚沙成塔·每天进步一点点⭐专栏简介⭐JavaScript中的链式调用⭐示例⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界记得点击上方或者右侧链接订阅本专栏哦几何带你启航前端之旅欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发

Linux入门教程||Linux 文件与目录管理

我们知道Linux的目录结构为树状结构,最顶级的目录为根目录/。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。在开始本教程前我们需要先知道什么是绝对路径与相对路径。绝对路径:路径的写法,由根目录/写起,例如:/usr/share/doc这个目录。相对路径:路径的写法,不是由/写起,例如由/usr/sh

华为云云耀云服务器L实例评测|服务器反挖矿防护指南

前言本文为华为云云耀云服务器L实例测评文章,测评内容是云耀云服务器L实例反挖矿防护指南系统配置:2核2G3MCentOS7.9之前的文章中『一文教你如何防御数据库恶意攻击』,我们讲到黑客如何通过攻击数据库来获取权限,以及我们需要如何处理防护云耀云服务器L实例接下来我们将要讲述另外一种黑客攻击的手段——挖矿,本文将从黑客

Acwing算法心得——猜测短跑队员的速度(重写比较器)

大家好,我是晴天学长,今天的算法题用到了比较器的知识,是经常会用到的一个知识点,常见与同种数据的排序,需要的小伙伴请自取哦!如果觉得写的不错的话,可以点个关注哦,后续会继续更新的。💪💪💪1)猜测短跑队员的速度一个短跑运动员在一个数轴上跑步。他的奔跑速度是恒定的,但是奔跑方向可能会不断发生改变,有时朝数轴正方向,有

学习潘海东博士的《潮汐调和分析原理和应用》和调和分析软件S_Tide

潘海东博士在B站(用户名:ocean_tide)分享了他的电子书《潮汐调和分析原理和应用》,以及他开发的潮汐调和分析工具包S_Tide,非常厉害。水文同事在进行潮汐预报的时候,会经常说到调和分析和调和常数,博主一听到这些名词就懵圈,不明所以。而《潮汐调和分析原理和应用》开篇就讲潮汐调和分析求解分潮振幅和迟角的过程本质就

【每日随笔】关于 “ 终身学习 “ ① ( 各阶段学习过程 | 扫盲教育与选拔教育阶段 | 研究生阶段 | 终身学习阶段 )

文章目录一、学习的各个阶段1、扫盲教育与选拔教育阶段2、研究生阶段3、终身学习阶段4、终身学习内容推荐一、学习的各个阶段1、扫盲教育与选拔教育阶段小学六年和初中三年是扫盲教育,也就是九年义务教育,这是为了扫盲用的,初中毕业,就可以成为一个合格的劳动力;高中三年和大学四年是选拔教育,是用来选拔人才的,在之前知识的基础上,

解锁 zkSync Era:开创全新的 Layer 2 扩展时代

作者:stella@footprint.network数据来源:zkSyncDashboard在解决以太坊扩展性问题方面,Layer2解决方案备受关注。这些解决方案旨在通过引入Rollups,StateChannels或NestedBlockchains等技术来克服Layer1的局限性。在Layer2扩展领域,围绕Op

Java/JDK 21正式发布!15个特性一览

JDK21已经于2023年9月19日正式发布。本文总结了JDK21发布的新特性。发布版本说明根据发布的规划,这次发布的JDK21将是一个长期支持版(LTS版)。LTS版每2年发布一个,上一次长期支持版是21年9月发布的JDK17。本版本是JavaSE平台21版的参考实现,由Java社区流程中的JSR396指定。安装包下

「干货」洁净室悬浮粒子计数器全部常见型号参数汇总

我们的人体工程学设计轻巧的Lighthouse手持式3016-IAQ是市场上先进的手持式粒子计数器,其质量浓度模式的密度约为μg/m3。Lighthouse手持式粒子计数器最多可提供6个粒径同时计数的通道,可在快速,易于阅读的彩色触摸屏上显示累积和差分粒子计数数据以及温度/相对湿度数据。可测量PM0.5,PM1.0,P

融合柯西变异和自适应莱维飞行的布谷鸟优化算法,改进布谷鸟,MATLAB代码

经常有小伙伴后台留言问:作者改进的算法可不可以用来写论文呀?回答是:当然可以!且不用加引用!如果我的文章能帮助到大家写论文,那是作者的荣幸呀!布谷鸟优化算法是一个非常经典的优化算法,直到今天还有不少人研究对其改进。今天为大家带来一期由小淘自行改进的布谷鸟优化算法---融合柯西变异和自适应莱维飞行的布谷鸟优化算法(Cau

正则表达式以及python的re模块介绍

正则表达式字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义

热文推荐