本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 加入知识星球提问。

双周赛 106 概览

T1. 判断一个数是否迷人(Easy)

  • 标签:计数

T2. 找到最长的半重复子字符串(Medium)

  • 标签:同向双指针

T3. 移动机器人(Medium)

  • 标签:脑筋急转弯、排序

T4. 找到矩阵中的好子集(Hard)

  • 标签:散列表、贪心


T1. 判断一个数是否迷人(Easy)

https://leetcode.cn/problems/check-if-the-number-is-fascinating/description/

题解一(计数)

  • 计算拼接后的数字,并检查数字 1 到 9 的数量是否为 1,可以用字符串比较来模拟计数;
  • 观察数字规律,合法 n 的有效范围是 [123, 329]。
class Solution {
fun isFascinating(n: Int): Boolean {
if (n !in 123..329) return false
return "123456789" == "$n${2*n}${3*n}".asSequence().sorted().joinToString("")
}
}

复杂度分析:

  • 时间复杂度:O(UlgU) U 是单个数字的最大长度
  • 空间复杂度:O(U)

题解二(打表)

题目范围中只有 4 个迷人数。

class Solution {
fun isFascinating(n: Int): Boolean {
return n in arrayOf(192, 219, 273, 327)
}
}

复杂度分析:

  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

T2. 找到最长的半重复子字符串(Medium)

https://leetcode.cn/problems/find-the-longest-semi-repetitive-substring/

题解(同向双指针)

维护滑动窗口,如果右指针与前一个位置相同,说明增加一个相邻重复对。

当相邻重复对 repeatCnt 大于 1 时,此时需要收缩左指针,如果左指针与右边后一个位置相同,说明减少一个相邻重复对(由于 repeatCnt 大于 1 时左指针不可能超过窗口,所以不需要检查左指针移动越界)。

class Solution {
fun longestSemiRepetitiveSubstring(s: String): Int {
val n = s.length
var ret = 0
var i = 0
var repeatCnt = 0
for (j in 0 until n) {
// 移动右指针
if (j > 0 && s[j] == s[j - 1]) repeatCnt ++
while (repeatCnt > 1) {
// 移动左指针
if (s[i] == s[i + 1]) repeatCnt --
i++
}
// 记录结果
ret = Math.max(ret, j - i + 1)
}
return ret
}
}

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

T3. 移动机器人(Medium)

https://leetcode.cn/problems/movement-of-robots/

题解(模拟 + 排序)

注意到当发生碰撞而改变机器人方向时,我们可以对调机器人身份,此时等价于没有发生碰撞且机器人按照正常方向行驶,因此我们可以直接忽视碰撞规则,计算机器人的最终位置并计算两两距离。

为了计算两两距离,我们先对所有点排序。由于两个机器人的距离公式是 x - y,那么对于每个机器人 nums[i],在距离公式中它将作为 i 次 x 做加法,以及作为 (n -1 - i) 次 y 做解法,可以枚举每个机器人对距离公式的贡献度而算出整体的两两距离和。

class Solution {
fun sumDistance(nums: IntArray, s: String, d: Int): Int {
val n = nums.size
val MOD = 1000000007
// 移动(忽视碰撞)
for (i in nums.indices) {
nums[i] += if (s[i] == 'R') d else -d
}
// 排序
nums.sort()
// 计算两两距离
var ret = 0L
for (i in nums.indices) {
ret = (ret + (2L * i - n + 1) * nums[i]) % MOD
}
return ret.toInt()
}
}

复杂度分析:

  • 时间复杂度:O(nlgn) 瓶颈在排序
  • 空间复杂度:O(lgn)

相似题目:


T4. 找到矩阵中的好子集(Hard)

https://leetcode.cn/problems/find-a-good-subset-of-the-matrix/

题解(散列 + 贪心)

容易想到,我们需要选择出 1 相对稀疏的那些行(但不一定是最稀疏的行),而且重复选择完全相同的行不会对结果产生价值,所以我们先对行去重。

由于题目最多只有5 列,所有最多只有 2^5=32 种行类型,可以证明题目在 n = 5 的情况下,有效解最多只有 2 行。

class Solution {
fun goodSubsetofBinaryMatrix(grid: Array<IntArray>): List<Int> {
val n = grid.size
val m = grid[0].size
// 分组
val U = 32 // 0 - 31
val indexs = IntArray(U) { -1 }
for ((i, row) in grid.withIndex()) {
var mask = 0
for ((j, e) in row.withIndex()) {
mask = mask or (e shl j)
}
indexs[mask] = i
}
// 全 0
if (-1 != indexs[0]) return listOf(indexs[0])
// 贪心
for (x in 1 until U) {
for (y in 1 until U) {
// 过滤
if (-1 == indexs[x] || -1 == indexs[y]) continue
// 是否互补
if (x and y == 0) return listOf(indexs[x], indexs[y]).sorted()
}
}
return Collections.emptyList()
}
}

复杂度分析:

  • 时间复杂度:O(n + U^2) U = 32
  • 空间复杂度:O(U)

往期回顾

LeetCode 双周赛 106(2023/06/10)两道思维题的更多相关文章

  1. LeetCode 双周赛 101,DP/中心位贪心/裴蜀定理/Dijkstra/最小环

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 这周比较忙,上周末的双周赛题解现在才更新,虽迟但到哈.上周末这场是 LeetCode 第 ...

  2. LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,欢迎来到小彭的 LeetCode 周赛解题报告. 昨晚是 LeetCode 双周赛第 102 场,你 ...

  3. LeetCode 双周赛 98,脑筋急转弯转不过来!

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 昨晚是 LeetCode 第 98 场双周赛,你参加了吗?这场周赛需要脑筋急转弯,转不过 ...

  4. 刷爆 LeetCode 双周赛 100,单方面宣布第一题最难

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 100 场双周赛,你参加了吗?这场周赛整体没有 Hard ...

  5. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...

  6. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  7. LeetCode双周赛#36

    1604. 警告一小时内使用相同员工卡大于等于三次的人 题目链接 题意 给定两个字符串数组keyName和keyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24 ...

  8. LeetCode双周赛#34

    5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...

  9. LeetCode双周赛#35

    1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...

  10. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

随机推荐

  1. MyBatis各个版本下载 以及 Apache Maven 安装

    推荐下面两篇文章:实测有效! MyBatis下载和环境搭建 Maven详细安装教程

  2. Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画、海报等设计的插件

    简介 Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画.海报等设计的插件,此插件可以是你在 ...

  3. Spring Boot 中的 ApplicationRunner 和 CommandLineRunner

    前言 一般项目中的初始化操作,初次遇见,妙不可言.如果你还有哪些方式可用于初始化操作,欢迎在评论中分享出来~ ApplicationRunner 和 CommandLineRunner Spring ...

  4. jQ-DOM属性的操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. ACM-NEFUOJ-汉诺塔问题

    P200汉诺塔 #include<bits/stdc++.h> using namespace std; int main() { int n,i; long long s[40]; s[ ...

  6. 「刷起来」Go必看的进阶面试题详解

    勤学如春起之苗,不见其增日有所长:辍学如磨刀之石,不见其损日有所亏. 本文的重点:逃逸分析.延迟语句.散列表.通道.接口. 1.逃逸分析 逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分 ...

  7. 自用纯C语言实现任务调度(可用于STM32、C51等单片机)

    前言   这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟 ...

  8. Github 添加贪吃蛇动画

    前言 我们都知道,对于Github来说,当你选择你的账户时,可以看到自己的提交记录. 于是就有大神动脑筋了,这些commit记录都是一些豆,如果弄一条蛇来,不就可以搞个贪吃蛇了吗? 有道理有道理,本文 ...

  9. 33-webpack详细配置output

    const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...

  10. springCloud项目搭建版本选择

    1.查看spring cloud的版本 https://spring.io/projects/spring-cloud#learn 选择spring boot版本 https://mvnreposit ...