首页 > 其他分享 >LeetCode 双周赛 106(2023/06/10)两道思维题

LeetCode 双周赛 106(2023/06/10)两道思维题

时间:2023-06-11 16:34:22浏览次数:57  
标签:10 return val nums 复杂度 双周 ret indexs 06

本文已收录到 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)

往期回顾

标签:10,return,val,nums,复杂度,双周,ret,indexs,06
From: https://www.cnblogs.com/pengxurui/p/17473126.html

相关文章

  • 基于QT实现的影院票务系统[2023-06-11]
    基于QT实现的影院票务系统[2023-06-11]1系统权限管理系统分3种用户权限:A游客权限-注册会员,查看电影场次信息,购买电影票。B会员权限-登录系统,管理个人信息,查看电影场次信息,购买电影票。C票务管理权限-登录系统,管理电影场次信息,查看电影票售卖情况,管理会员。以上为基础需......
  • C/C++数学口算比赛系统[2023-06-11]
    C/C++数学口算比赛系统[2023-06-11]题目三数学口算比赛系统设计要求:适用于小学生数学口算比赛的系统。比赛题型分为两种:“四则简单运算”和“四则混合运算”,计算机随机出题,选手计时回答。要求进入每种题型比赛时,计算机均有提示,每人的得分情况随时更新。菜单格式如图。基......
  • 第10章 组合模式(Composite Pattern)
    组合模式(CompositePattern)——.NET设计模式系列之十一Terrylee,2006年3月概述组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。意图将对象组合......
  • Win10任务栏右下角日期时间秒数 星期几显示设置
    步骤1:点击跳转步骤2:点击跳转Tips:记得关闭小任务栏模式否则日期和周几都不会显示......
  • 算法学习day53动态规划part14-1143、53、1035
    packageLeetCode.DPpart14;/***1143.最长公共子序列*给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。*如果不存在公共子序列,返回0。*一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些......
  • React - 06 初步尝试封装组件
    1.封装dialog组件调用2.函数组件是静态组件/*函数组件是“静态组件”第一次渲染组件,把函数执行+产生一个私有的上下文:EC(V)+把解析出来的props「含children」传递进来「但是被冻结了」+对函数返回的JSX元素「virtualDOM」进行渲染当我们点击按钮的......
  • 10、Docker利用数据卷实现容器数据持久化与数据卷容器
    Docker利用数据卷实现容器数据持久化docker容器的分层容器的数据分层目录LowerDir:image镜像层,即镜像本身,只读UpperDir:容器的上层,可读写,容器变化的数据存放在此处,创建好容器,修改了数据,新生的的修改数据放在此处MergedDir:容器的文件系统,使用UnionFS(联合文件系统)......
  • 【愚公系列】2023年06月 攻防世界-Web(disabled_button)
    (文章目录)<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">前言HTML中的disabled属性是一个布尔属性,用于禁用表单元素或按钮的交互性能,使其无法接收用户输入或点击等交互操作。具体来说,disabled属性被设置为true时,表单元素或按钮将无法响应用户的......
  • 2023.6.1101.数据库基础介绍
    数据库基础介绍数据库概述数据库运维 1.认识MySQL什么是数据库数据库是⼀个⽤于存储和管理数据的电⼦化系统。我们可以把它想象成⼀个⼤型的⽂件柜,⾥⾯存储着各种类型的数据,例如个⼈信息、产品信息、订单信息等等。这些数据可以被组织、管理和检索,以⽅便⽤户快速地找到......
  • tinywin10下载地址
    地址https://archive.org/details/tiny-10_202301下载入口优势系统占用不足10G......