【力扣周赛】第 111 场双周赛(状态机数位DP)⭐

文章目录

比赛链接

https://leetcode.cn/contest/biweekly-contest-111

Q1:6954. 统计和小于目标的下标对数目

https://leetcode.cn/problems/count-pairs-whose-sum-is-less-than-target/
在这里插入图片描述

提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50

解法1—— O ( n 2 ) O(n^2) O(n2)暴力

class Solution {public int countPairs(List<Integer> nums, int target) {int ans = 0, n = nums.size();for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (nums.get(i) + nums.get(j) < target) ans++;}}return ans;}
}

解法2——排序+双指针 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

排序之后使用双向双指针,

class Solution {public int countPairs(List<Integer> nums, int target) {Collections.sort(nums);int ans = 0, l = 0, r = nums.size() - 1;while (l < r) {if (nums.get(l) + nums.get(r) < target) {ans += r - l;l++;} else r--;}return ans;}
}

Q2:8014. 循环增长使字符串子序列等于另一个字符串

https://leetcode.cn/problems/make-string-a-subsequence-using-cyclic-increments/

在这里插入图片描述
提示:
1 <= str1.length <= 10^5
1 <= str2.length <= 10^5
str1 和 str2 只包含小写英文字母。

双指针

其实就是双指针判断子序列那道题目,除了可以相同匹配外,还可以循环+1后匹配。

class Solution {public boolean canMakeSubsequence(String s1, String s2) {int m = s1.length(), n = s2.length();int i = 0, j = 0;while (i < m && j < n) {// 如果可以匹配上if (s1.charAt(i) == s2.charAt(j) || (s1.charAt(i) + 1 - 'a') % 26 == (s2.charAt(j) - 'a') % 26) ++j;++i;}return j == n;}
}

相似题目——392. 判断子序列

https://leetcode.cn/problems/is-subsequence/description/

在这里插入图片描述

class Solution {public boolean isSubsequence(String s, String t) {int n1 = s.length(), n2 = t.length();int i = 0, j = 0;while (i < n1 && j < n2) {if (s.charAt(i) == t.charAt(j)) i++;j++;}return i == n1;}
}

Q3:6941. 将三个组排序

https://leetcode.cn/problems/sorting-three-groups/
在这里插入图片描述

提示:
1 <= nums.length <= 100
1 <= nums[i] <= 3

解法1——转化成最长非递减子序列

转换成最多可以保留多少个元素不变,这些保留的元素必须是非递减的。
那么答案就是除了这些保留的元素之外需要被删去的元素数量。

代码1—— O ( n 2 ) O(n^2) O(n2)dp

class Solution {public int minimumOperations(List<Integer> nums) {int n = nums.size(), ans = 0;int[] dp = new int[n];for (int i = 0; i < n; ++i) {dp[i] = 1;for (int j = 0; j < i; ++j) {if (nums.get(i) >= nums.get(j)) dp[i] = Math.max(dp[i], dp[j] + 1);}ans = Math.max(ans, dp[i]);}return n - ans;}
}

代码2——二分写法(更快 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

class Solution {public int minimumOperations(List<Integer> nums) {int n = nums.size();List<Integer> g = new ArrayList<>();for (int i = 0; i < n; ++i) {int l = 0, r = g.size();while (l < r) {int mid = l + r >> 1;if (g.get(mid) <= nums.get(i)) l = mid + 1;else r = mid;}if (l == g.size()) g.add(nums.get(i));else g.set(l, nums.get(i));}return n - g.size();}
}

解法2——状态机DP

定义 f[i+1][j] 表示考虑 nums[0] 到 nums[i],且 nums[i] 变成 j 的最小修改次数。

class Solution {public int minimumOperations(List<Integer> nums) {int n = nums.size();int[][] dp = new int[n + 1][4];for (int i = 1; i <= n; ++i) {// 从0~i,且nums[i]变成jfor (int j = 1; j <= 3; ++j) {dp[i][j] = dp[i - 1][j];// 枚举第 i-1 个数字变成了 kfor (int k = 1; k < j; ++k) {dp[i][j] = Math.min(dp[i][j], dp[i - 1][k]);}if (j != nums.get(i - 1)) dp[i][j]++;}}int ans = n;for (int j = 1; j <= 3; ++j) {ans = Math.min(ans, dp[n][j]);}return ans;}
}

Q4:8013. 范围中美丽整数的数目(数位DP)⭐⭐⭐⭐⭐

https://leetcode.cn/problems/number-of-beautiful-integers-in-the-range/

在这里插入图片描述
提示:
0 < low <= high <= 10^9
0 < k <= 20

更多关于数位DP可见:
【算法】数位DP
【算法基础:动态规划】5.4 数位统计DP(计数问题)(数位DP)

解法

在这里插入图片描述

代码如下:

class Solution {int[][][] memo;char[] s;int m, k;public int numberOfBeautifulIntegers(int low, int high, int k) {this.k = k;return op(high) - op(low - 1);}public int op(int n) {s = Integer.toString(n).toCharArray();m = s.length;memo = new int[m][k][m * 2 + 1];for (int i = 0; i < m; ++i) {for (int j = 0; j < k; ++j) {Arrays.fill(memo[i][j], -1);}}return dfs(0, true, false, 0, m);}public int dfs(int i, boolean isLimit, boolean isNum, int val, int diff) {if (i == s.length) return isNum && val == 0 && diff == m? 1: 0;if (!isLimit && isNum && memo[i][val][diff] != -1) return memo[i][val][diff];int res = 0;if (!isNum) res = dfs(i + 1, false, false, 0, m);int up = isLimit? s[i] - '0': 9;for (int d = isNum? 0: 1; d <= up; ++d) {res += dfs(i + 1, isLimit && d == up, true, (val * 10 + d) % k, diff + d % 2 * 2 - 1);}if (!isLimit && isNum) memo[i][val][diff] = res;return res;}
}

使用到的技巧

判断这个数可以被 k 整除

由于是从前往后的,也就是从高位到低位,所以每次执行 (val * 10 + d) % k

判断奇数数位和偶数数位的数量之差

使用 diff 记录两者的数量之差,初始设置为 m,原因是作为数组的下标不能出现负数。
每次执行 diff + d % 2 * 2 - 1) ,这样如果 d 是奇数就会 + 1,否则就会 - 1。

成绩记录

在这里插入图片描述
就是很垃圾的成绩了。。。

在这里插入图片描述

参考资料

[第111场双周赛]式酱的解题报告

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下jenkins全量迁移到新服务器

文章目录 1、目的2、迁移1&#xff09;查看jenkins的主目录2&#xff09;登录要迁出的服务器打包3&#xff09;找到对应的war包4&#xff09;登录对应迁入服务&#xff0c;上传war包和打包的jenkins数据等5&#xff09;在新的服务器解压迁入的数据等&#xff0c;并查看端口是否…

AUTOSAR系列专题--诊断模块(下)

往期小怿向各位小伙伴介绍了&#xff0c;文章内容过多分为了两期&#xff0c;本期为大家介绍《AUTOSAR模块之诊断篇&#xff08;下&#xff09;》。 目录 1.概述 2.DCM 3.DEM 4.FIM 5.结语 点击查看前文&#xff1a;AUTOSAR系列专题--诊断模块&#xff08;上&#xff09;…

【Java 中级】一文精通 Spring MVC - 数据格式化器(六)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

小红书口碑营销技巧有哪些,打造独特品牌内容

作为一款社交电商平台&#xff0c;从目前来看&#xff0c;其实小红书也算是比较不错的口碑营销传播平台了。今天就来带大家一起分享下&#xff0c;小红书口碑营销技巧有哪些&#xff0c;打造独特品牌内容&#xff01; ​ 一、小红书口碑营销怎么做 1. 了解目标用户 首先需要明…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

前端如何走通后端接口

0 写在前面 现在基本都是前后端分离的项目了&#xff0c;那么前端小伙伴如何获取后端小伙伴接口呢&#xff1f; 1 条件 同一WiFi下&#xff0c;让后端小伙伴分享出自己的ip地址&#xff1a; 步骤1:winr调出运行界面 步骤2&#xff1a;cmd调出命令行窗口 步骤3&#xff1a;…

C#,《小白学程序》第三课:类、类数组与排序

1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /// 学号 /// </summary> public int Id; /// <summary> /// 姓名 /// </summary> public string Nam…

小研究 - Android 字节码动态分析分布式框架(五)

安卓平台是个多进程同时运行的系统&#xff0c;它还缺少合适的动态分析接口。因此&#xff0c;在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架&#xff0c;无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

【C++】初始化列表

前言&#xff1a;这个知识点的细节比较多&#xff0c;且有些细节不太容易理解&#xff0c;要做好准备哟&#x1f47b; Ⅰ.构造函数的不完美&#x1f62d; 初始化列表&#xff0c;顾名思义&#xff0c;用列表一样的格式将其初始化。 &#x1f914;奇怪啊&#xff0c;构造函数的…

【Ubuntu 20.04 安装 搜狗输入法】细节注意

建议下载地址为&#xff1a; 搜狗拼音下载地址-Linux 也即是这个主页&#xff1a;适配Ubuntu20.04 安装过程根据官方文档即可 即 官方安装文档 一般不会出错

Vue2向Vue3过度Vuex状态管理工具快速入门

目录 1 Vuex概述1.是什么2.使用场景3.优势4.注意&#xff1a; 2 需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 3 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例…

IDEA下SpringBoot指定环境、配置文件启动

1、idea下的SpringBoot启动&#xff1a;指定配置文件 Springboot项目有如下配置文件 主配置文件application.yml&#xff0c; 测试环境&#xff1a;application-test.yml 生产环境&#xff1a;application-pro.yml 开发环境&#xff1a;application-dev.yml 1.1.配置文件…