LeeCode 92双周赛复盘
T1: 分割圆的最少切割次数
思维题:
n 为偶数时,可以对半切割,切割 \(\frac{n}{2}\)次即可
n 为奇数时,不满足对称性,需要切割 n 次
n 为 1 时,不需要切割
public int numberOfCuts(int n) {
if (n == 1) {
return 0;
}
if (n % 2 == 0) {
return n / 2;
}
return n;
}
T2: 行和列中一和零的差值
思路:按要求模拟即可,第一次遍历统计,第二次遍历计算。
public int[][] onesMinusZeros(int[][] grid) {
// 第一遍遍历统计第 i 行 0 的数目和第 j 列 0 的数目
int m = grid.length;
int n = grid[0].length;
int[] zeroRow = new int[m];
int[] zeroCol = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 0) {
zeroRow[i] += 1;
zeroCol[j] += 1;
}
}
}
// 构建差值矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
grid[i][j] = (n - zeroRow[i]) + (m - zeroCol[j]) - (zeroRow[i]) - (zeroCol[j]);
}
}
return grid;
}
T3: 商店的最小代价
思路:前后缀统计
第一次遍历统计字符串中
Y的个数,即在 0 小时关门的代价第二次遍历计算在
1~N小时关门的代价
public int bestClosingTime(String customers) {
int pos = 0;
int cost = 0;
for (int i = 0; i < customers.length(); i++) {
if (customers.charAt(i) == 'Y') {
cost += 1;
}
}
if (cost == 0) {
return pos;
}
int min = cost;
for (int i = 1; i <= customers.length(); i++) {
if (customers.charAt(i - 1) == 'Y') {
cost -= 1;
}
else {
cost += 1;
}
if (cost < min) {
min = cost;
pos = i;
}
}
return pos;
}
T4: 统计回文子序列的数目
思路:动态规划 + 前缀/后缀和
回文子序列的长度固定为5,则其形式必须为xyzyx(x、y、z可以相等),即回文中心为单个字符,左右包括两个对称的双字符序列。
由于字符串只包含0~9的数字,所以 xy 一共只有100种
- 枚举所有回文中心 i,统计s[0, i - 1]中 xy 的个数,s[i + 1, s.length() - 1] 中 yx 的个数
- \(ans = \sum_{i = 0}^{s.length() - 1} {\sum_{0}^{99} {count_{ab} * count_{ba}}}\)
如何高效统计 s[0, i-1] 以及 s[i + 1, s.length() - 1] 中各对字符的个数呢?
- 利用动态规划的思想,统计
s[0, i - 1]中 xy 的个数,正向遍历字符串 - \(\begin{cases}dp[i][j][k] = dp[i - 1][j][k] + prefix[j] \quad (s[i] == k) \\dp[i][j][k] = dp[i - 1][j][k] \quad (s[i] != k)\end{cases}\)
- 上述公式中 prefix[j] 表示
s[0, i - 1]中 j 的个数 - 由于动态规划过程中当前状态只取决于上一状态,可以将其简化为 \(dp[j][k] += prefix[j] \quad (s[i] == k)\)
- 统计
s[i + 1, s.length() - 1]中 yx 的个数也是类似的道理,需要逆向遍历字符串并维护一个后缀数组suffix
/**
* 核心思路:回文串长度为5, 等价于回文中心是单个数字,且左右各有两个对称的数字, 即 12321
*
* 枚举所有的回文中心 i (0 <= i <= s.length() - 1)
* 统计 s[0 ... i - 1] 中 xy 的个数 count1, xy只有 100 种情况
* 统计 s[i + 1 ... s.length() - 1] 中 yx 的个数 count2
*
* ans = \sum_{0}^{s.length() - 1} {\sum_{0}^{99} {count1 * count2}}
* @param s
* @return
*/
public int countPalindromes(String s) {
char[] arr = s.toCharArray();
int[] prefix = new int[10];
int[] suffix = new int[10];
int[][] prefix2 = new int[10][10];
int[][] suffix2 = new int[10][10];
// 逆序遍历, 统计 xy 个数
// dp[pos][x][y] = dp[pos + 1][x][y] + suffix[y] if (cur == x)
// dp[pos][x][y] = dp[pos + 1][x][y] if (cur != x)
for (int i = arr.length - 1; i >= 0; i--) {
int cur = arr[i] - '0';
for (int j = 0; j <= 9; j++) {
suffix2[cur][j] += suffix[j];
}
suffix[cur] += 1;
}
int ans = 0;
for (int i = 0; i < arr.length; i++) {
int cur = arr[i] - '0';
suffix[cur] -= 1;
// 去除后序遍历计算的包括当前位置的xy个数
for (int j = 0; j <= 9; j++) {
suffix2[cur][j] -= suffix[j];
}
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= 9; k++) {
ans += (long) prefix2[k][j] * suffix2[j][k];
}
}
for (int j = 0; j <= 9; j++) {
prefix2[j][cur] += prefix[j];
}
prefix[cur] += 1;
}
return (int) (ans % MOD);
}
LeeCode 92双周赛复盘的更多相关文章
- leetcode 双周赛9 进击的骑士
一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...
- leetcode 双周赛9 找出所有行中最小公共元素
给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...
- LeetCode第8场双周赛(Java)
这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...
- LeetCode 第 15 场双周赛
1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...
- LeetCode 第 14 场双周赛
基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...
- leetcode-15双周赛-1286-字母组合迭代器
题目描述: 方法: class CombinationIterator: def __init__(self, characters: str, combinationLength: int): se ...
- leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素
题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr ...
- leetcode-15双周赛-1288-删除被覆盖区间
题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...
- leetcode-15双周赛-1289-下降路径最小和
题目描述: 方法一:动态规划 O(N^3) class Solution: def minFallingPathSum(self, arr: List[List[int]]) -> int: n ...
- leetcode-第14周双周赛-1274-矩形内船只的数目
题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...
随机推荐
- jq的用法
选择页面中的元素,得到jQuery实例对象 ID选择器$("#save") 类选择器$(".class") 标签选择器$("div") 复合 ...
- 3html5
<label>网址:</label><input type="url" name="" required><br> ...
- kubeadm搭建k8s
一.kubeadm 部署 K8S 集群架构 主机名 IP地址 安装组件 master(2C/4G,cpu核心数要求大于2) 192.168.160.20 docker.kubeadm.kubelet. ...
- 关于SQLServer数据库DBCC CHECKIDENT命令
在SQLServer输入数据时,碰到有主键ID需要维护时,可使用IDENT_CURRENT和CHECKIDENT命令来维护. 一般我们的用法如下: 1) 查看且如有必要更正当前标识值: ...
- Code UTF-8 Console GB2312 Linux 中文乱码
Linux 系统方法: LD_LIBRARY_PATH=. ./userdemo | iconv -f GB2312 -t utf8 Shell 方法 Shell 编码 改成GB2312 // 编 ...
- django orm的增删改查 以及django1.x和2.x的区别
ORM对字段的增删改查 # 建一个作者表 class Author(models.Model): ''' 如果你以后在创建表的时候,主键就叫id名,那么可以省略不写,orm会自动帮你创建出主键名称为i ...
- 基于R的Bilibili视频数据建模及分析——预处理篇
基于R的Bilibili视频数据建模及分析--预处理篇 文章目录 基于R的Bilibili视频数据建模及分析--预处理篇 0.写在前面 1.项目介绍 1.1 项目背景 1.2 数据来源 1.3 数据集 ...
- 《Unix/Linux系统编程》第九周学习笔记
<Unix/Linux系统编程>第九周学习笔记 信号和中断 中断"是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移 到中断处理.与发送给CPU的中断请求一 ...
- STM32上特殊管脚应用 重映射那个GPIO_Remap_SWJ_JTAGDisable
对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解. 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能 ...
- OSPF v3与v2的区别