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 ...
随机推荐
- mysql数据库如何支持emoji表情
mysql数据库的默认字符集utf8,只能存储3个字节的数据.标准的emoji表情是4个字节,在APP端输入 保存表情是用户的普遍需求和行为. 插入数据库报错如下: java.sql.SQLExcep ...
- Unity 转小游戏
填写appid 和游戏资源位置 在导出的项目里可以修改游戏资源位置 两个目录 minigame 是小程序打开的目录 webgl 是要下载的的资源 下载一个http 服务器就有了 和JS交互 大部分js ...
- 重写antd组件样式
:global { .ant-select-selection-placeholder { color: #FFF; font-size: 14px; } .ant-select-selection- ...
- 关系类处理专题之创建关系类|RelationShipClass
/// <summary> /// 存在于数据库中的数据集中 /// </summary> /// <param name="mdbPath"> ...
- sqlserver 生成随机值
随机生成100以内的整数 select top 10 number,ceiling(rand(checksum(newid()))*100) from master.dbo.spt_valueswhe ...
- mysql 排序ROW_NUMBER() RANK() DENSE_RANK()
with 月业绩 as (SELECT 年份,月份, ROUND(sum(总业绩)/100000) 业绩 FROM `myj` group by 年份,月份) select * ,ROW_NUMBER ...
- unidbgrid按回车键切换到右侧CELL
打开UniDBGrid的ClientEvents->ExtEvents属性,编辑Ext.grid.Panel的reconfig函数,输入如下代码就可以实现当UniDBGrid表格的ReadOnl ...
- UniDBGrid控件的几个功能优化
内容自动换行 默认UniDBGrid的cell内的内容如果超出表格列宽并不自动换行和调整行高,给客户带来极大的不方便,通过修改ServerModule的属性CustomCSS可以实现. <sty ...
- scala apply方法和update方法
示例代码1 class TestApplyClass { def apply(param: String): String = { println("apply method called, ...
- .Net中跨域问题的解决方案
开发中前端与后端完全分离并分开发布,遇到跨域问题,一通百度之后,解决方案如下: 把下面的代码放在web.config文件中的 System.WebServer 节点下 <httpProtocol ...