周赛362(差分数组、脑经急转弯、全排列、矩阵快速幂优化DP)

news2024/11/20 18:32:17

文章目录

  • 周赛362
    • [2848. 与车相交的点](https://leetcode.cn/problems/points-that-intersect-with-cars/)
      • 差分数组
    • [2849. 判断能否在给定时间到达单元格](https://leetcode.cn/problems/determine-if-a-cell-is-reachable-at-a-given-time/)
      • 脑经急转弯
    • [2850. 将石头分散到网格图的最少移动次数](https://leetcode.cn/problems/minimum-moves-to-spread-stones-over-grid/)
      • 枚举全排列
    • [2851. 字符串转换](https://leetcode.cn/problems/string-transformation/)
      • KMP + 矩阵快速幂优化DP

周赛362

2848. 与车相交的点

简单

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

返回数轴上被车 任意部分 覆盖的整数点的数目。

示例 1:

输入:nums = [[3,6],[1,5],[4,7]]
输出:7
解释:从 1 到 7 的所有点都至少与一辆车相交,因此答案为 7 。

示例 2:

输入:nums = [[1,3],[5,8]]
输出:7
解释:1、2、3、5、6、7、8 共计 7 个点满足至少与一辆车相交,因此答案为 7 。

提示:

  • 1 <= nums.length <= 100
  • nums[i].length == 2
  • 1 <= starti <= endi <= 100

差分数组

  • 区间更新,单点查询
class Solution {
    public int numberOfPoints(List<List<Integer>> nums) {
        int n = 101;
        int[] diff = new int[n+5];
        for(List<Integer> list: nums){
            int x = list.get(0), y = list.get(1);
            diff[x] += 1;
            diff[y+1] -= 1;
        }
        int res = 0;
        int sum = 0;
        for(int x : diff){
            sum += x;
            if(sum > 0) res += 1;
        }
        return res;
    }
}

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

中等

给你四个整数 sxsyfxfy 以及一个 非负整数 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) 。

提示:

  • 1 <= sx, sy, fx, fy <= 109
  • 0 <= t <= 109

脑经急转弯

https://leetcode.cn/problems/determine-if-a-cell-is-reachable-at-a-given-time/solutions/2435696/zui-da-keng-dian-zai-yu-qi-dian-he-zhong-o2fg/

这道题又是非常像CF低段位场的签到题风格。注意到任何一步都可以拆成两步,斜走一步可以拆成横着走一步加上竖着走一步,而横或竖走一步也能拆成先斜走一步再反方向走一步(例如往右一步能等效成先右上走一步再往下走一步)。所以对于一般的情况,只要起点到终点的最少步数不超过t,那么总是有解的,多余的步数总可以浪费掉。

class Solution {
    /** 
    唯一的“不一般情况”就是当起点与终点重合且只能走1步时是无解的。
    起点终点重合且t>1时,无论第一步怎么走,剩下t-1步都有办法返回。
 */
    public boolean isReachableAtTime(int sx, int sy, int fx, int fy, int t) {
        if(sx == fx && sy == fy){
            return t == 1 ? false : true;
        }
        int mx = Math.abs(sx - fx) + Math.abs(sy - fy); // 最多步数
        int mn = Math.max(Math.abs(sx - fx), Math.abs(sy - fy)); // 最少步数
        return t >= mn;
    }
}

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

中等

给你一个大小为 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 。

提示:

  • grid.length == grid[i].length == 3
  • 0 <= grid[i][j] <= 9
  • grid 中元素之和为 9

枚举全排列

https://leetcode.cn/problems/minimum-moves-to-spread-stones-over-grid/solutions/2435313/tong-yong-zuo-fa-zui-xiao-fei-yong-zui-d-iuw8/

class Solution {
    public int minimumMoves(int[][] grid) {
        List<int[]> from = new ArrayList<>();
        List<int[]> to = new ArrayList<>();
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[i].length; j++){
                if(grid[i][j] > 1){
                    for(int k = 1; k < grid[i][j]; k++)
                        from.add(new int[]{i, j});
                }else if(grid[i][j] == 0){
                    to.add(new int[]{i, j});
                }
            }
        }
        int ans = Integer.MAX_VALUE;
        // 枚举from的全排列
        for(List<int[]> from2 : permutations(from)){
            int total = 0;
            for(int i = 0; i < from2.size(); i++){
                int[] f = from2.get(i);
                int[] t = to.get(i);
                total += Math.abs(f[0] - t[0]) + Math.abs(f[1] - t[1]);
            }
            ans = Math.min(ans, total);
        }
        return ans;
    }

    private List<List<int[]>> permutations(List<int[]> arr) {
        List<List<int[]>> result = new ArrayList<>();
        permute(arr, 0, result);
        return result;
    }

    private void permute(List<int[]> arr, int start, List<List<int[]>> result) {
        if (start == arr.size()) {
            result.add(new ArrayList<>(arr));
        }
        for (int i = start; i < arr.size(); i++) {
            swap(arr, start, i);
            permute(arr, start + 1, result);
            swap(arr, start, i);
        }
    }

    private void swap(List<int[]> arr, int i, int j) {
        int[] temp = arr.get(i);
        arr.set(i, arr.get(j));
        arr.set(j, temp);
    }
}

2851. 字符串转换

困难

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

  • s 长度为 l0 < l < n)的 后缀字符串 删除,并将它添加在 s 的开头。
    比方说,s = 'abcd' ,那么一次操作中,你可以删除后缀 'cd' ,并将它添加到 s 的开头,得到 s = 'cdab'

给你一个整数 k ,请你返回 恰好 k 次操作将 s 变为 t 的方案数。

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

示例 1:

输入:s = "abcd", t = "cdab", k = 2
输出:2
解释:
第一种方案:
第一次操作,选择 index = 3 开始的后缀,得到 s = "dabc" 。
第二次操作,选择 index = 3 开始的后缀,得到 s = "cdab" 。

第二种方案:
第一次操作,选择 index = 1 开始的后缀,得到 s = "bcda" 。
第二次操作,选择 index = 1 开始的后缀,得到 s = "cdab" 。

示例 2:

输入:s = "ababab", t = "ababab", k = 1
输出:2
解释:
第一种方案:
选择 index = 2 开始的后缀,得到 s = "ababab" 。

第二种方案:
选择 index = 4 开始的后缀,得到 s = "ababab" 。

提示:

  • 2 <= s.length <= 5 * 105
  • 1 <= k <= 1015
  • s.length == t.length
  • st 都只包含小写英文字母。

KMP + 矩阵快速幂优化DP

https://leetcode.cn/problems/string-transformation/solutions/2435348/kmp-ju-zhen-kuai-su-mi-you-hua-dp-by-end-vypf/

class Solution {
    public int numberOfWays(String s, String t, long k) {
        int n = s.length();
        int c = kmpSearch(s + s.substring(0, n - 1), t);
        long[][] m = {
            {c - 1, c},
            {n - c, n - 1 - c},
        };
        m = pow(m, k);
        return s.equals(t) ? (int) m[0][0] : (int) m[0][1];
    }

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

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

    private static final long MOD = (long) 1e9 + 7;

    // 矩阵乘法
    private long[][] multiply(long[][] a, long[][] b) {
        long[][] c = new long[2][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;
    }

    // 矩阵快速幂
    private long[][] pow(long[][] a, long n) {
        long[][] res = {{1, 0}, {0, 1}};
        for (; n > 0; n /= 2) {
            if (n % 2 > 0) {
                res = multiply(res, a);
            }
            a = multiply(a, a);
        }
        return res;
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7米层高建筑模板施工方案

在高层建筑的施工中&#xff0c;7米层高是一个常见的高度要求。为了确保施工的高效性和安全性&#xff0c;制定一套合理的7米层高模板施工方案至关重要。本文将就7米层高模板施工方案进行探讨&#xff0c;包括模板选择、搭建流程和安全措施等方面。 首先&#xff0c;模板的选择…

产品经理需要熟悉的网站

产品经理需要熟悉的网站 一、SAAS平台的聚合二、saas产品教程三、原型参考教程四、在线文档协作五、云笔记六、脑图&流程图 一、SAAS平台的聚合 作用&#xff1a;面试和工作的需要&#xff0c;方便各行业产品查找竞品。 网址&#xff1a;https://www.zhaosaas.com/&#x…

运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar

朋友 我当你一秒朋友 朋友 我当你一世朋友 奇怪 过去再不堪回首 怀缅 时时其实还有 运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar 基本可以断定&#xff0c;是jar不完整导致的。不完整&#xff01;&#xff01;&#xff01;记住关键字 检查1&#xff1a; …

如何统计iOS产品不同渠道的下载量?

一、前言 在开发过程中&#xff0c;Android可能会打出来很多的包&#xff0c;用于标识不同的商店下载量。原来觉得苹果只有一个商店&#xff1a;AppStore&#xff0c;如何做出不同来源的统计呢&#xff1f;本篇文章就是告诉大家如何做不同渠道来源统计。 二、正文 先看一下苹…

注册法国商标的步骤和时间

注册法国商标的步骤如下&#xff1a; 1、商标查询&#xff1a;在提交申请之前&#xff0c;建议进行商标查询&#xff0c;以确保商标在法国市场上具有独特性和显著性。 2、提交申请&#xff1a;通过法国知识产权局的在线平台提交商标申请。申请时&#xff0c;需要提供以下文件…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

SQLite3 操作命令以及c/c++编程API和例子

文章目录 数据库系统SQLiteSQLite数据类型SQLite语句介绍表的创建和查看表的删除插入和修改表数据的删除复制表和修改表结构事务处理函数操作数据分组group by约束联结表视图view触发器trigger日志操作索引 index SQLite c/c编程sqlite3_opensqlite3_closesqlite3_execsqlite3_…

华为云云服务器云耀L实例评测 | 华为云耀L实例:中小企业的最佳选择?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

地震反演基础知识2(代码演示)

文章目录 数据集代码演示1. SEG盐真实数据2. SEG盐速度模型3. SEG盐模拟地震数据4. SEG盐模拟速度模型5. openfwi地震数据6. openfwi速度模型 数据集代码演示 1. SEG盐真实数据 # 绘制SEG盐层数据的地震图像 def pain_seg_seismic_data(para_seismic_data):Plotting seismic …

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…

Material Design的基本使用方法、Tollbar、菜单等

一、Toolbar 1、基本用法 <androidx.appcompat.widget.Toolbarandroid:id"id/toolbar"android:layout_width"match_parent"android:layout_height"?attr/actionBarSize"android:background"color/cardview_dark_background"andr…

Linux:keepalived 双热备份(基础备份web)

简介 Keepalived是一个用于Linux环境的路由软件&#xff0c;具有健康检查功能以及可用于实现高可用性(High Availability, HA)的功能。它主要支持两种协议&#xff1a;VRRP (Virtual Router Redundancy Protocol) 和 LVS (Linux Virtual Server)。Keepalived的项目源代码托管在…

一文读懂 QUIC 协议:更快、更稳、更高效的网络通信

作者 | 李龙彦 来源&#xff1a;infoQ 你是否也有这样的困扰&#xff1a;打开 APP 巨耗时、刷剧一直在缓冲、追热搜打不开页面、信号稍微差点就直接加载失败…… 如果有一个协议能让你的上网速度&#xff0c;在不需要任何修改的情况下就能提升 20%&#xff0c;特别是网络差的…

一篇文章讲清楚 Mendix 与 SAP 集成开发流程

一、引言 在今日瞬息万变的商业环境中&#xff0c;大量企业依赖SAP&#xff0c;这款全球领先的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;来优化其业务流程。想象一下&#xff0c;在一家大型制造公司&#xff0c;SAP系统负责从供应链管理到财务报告的一切重要业…

day44:C++ day4,拷贝赋值、友元、常成员、运算符重载

一、仿照string类&#xff0c;完成myString 类 mystring.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字…

计算一串输出数字的累加和

计算一个文件内数字的累加和 awk {sum$1}END{print sum} 直接抽取数据以后的打印是这样的 cat step-iostat.1125.log |grep sda |cut -c "49-56" |awk {sum$1}END{print sum}

使用Arthas诊断线上问题的常见命令(热更新,监听耗时,方法出入参,jvm信息)

Arthas 启动&#xff08;windows&#xff09; jar包丢到项目任意目录&#xff0c;启动jar&#xff0c;选择java进程&#xff0c;项目上一般选择tomcat对应的pid java -jar arthas-boot.jar * [1]: 35542[2]: 71560 math-game.jar监听方法入参及返回 参数 返回对象 调用深度…

DC/DC开关电源学习笔记(五)开关电源的主要技术指标

(五)开关电源的主要技术指标 1.输入参数2.输出参数3.效率4.电压调整率和负载调整率5.动态特性:负载突变时输出电压的变化6.电源启动时间(Set-Up Time)与保持时间(Hold-Up Time)1.输入参数 输入电压大小,交流还是直流,相数,频率等。 2.输出参数 输出功率,输出电压,输出…

java自定义注解(Annotation)

概念 注解 (Annotation)是以“注解名称”的形式存在于代码中的&#xff0c;相信用过spring的小伙伴们都会使用大量的注解。注解是JDK1.5之后引入的&#xff0c;它可以写在类、方法、属性上面&#xff0c;用于说明或标记某些含义&#xff0c;这些说明或标记可用于生成文档、程序…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候&#xff0c;会结构体里的字段边上加tag&#xff0c;有没有什么办法可以获取到这个tag的内容呢&#xff1f; 举例 tag信息可以通过反射&#xff08;reflect包&#xff09;内的方法获取&#xff0c;通过一个例子加深理解。 package mainimport (&quo…