首页 > 其他分享 >LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

时间:2023-05-28 15:22:13浏览次数:51  
标签:周赛 set val 05 复杂度 ret LIS var indexs

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

周赛 347 概览

T1. 移除字符串中的尾随零(Easy)

  • 标签:模拟、字符串

T2. 对角线上不同值的数量差(Easy)

  • 标签:前后缀分解

T3. 使所有字符相等的最小成本(Medium)

  • 标签:模拟、贪心

T4. 矩阵中严格递增的单元格数(Hard)

  • 标签:排序、动态规划


T1. 移除字符串中的尾随零(Easy)

https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/

题解(模拟)

基于 StringBuilder:

class Solution {
    fun removeTrailingZeros(num : String): String {
        if (num.length == 1) return num
        val builder = StringBuilder(num)
        while (builder.last() == '0') {
            builder.deleteCharAt(builder.lastIndex)
        }
        return builder.toString()
    }
}

基于正则表达式匹配:

class Solution {
    fun removeTrailingZeros(num : String): String {
        return num.replace(Regex("0*$"), "")
    }
}

复杂度分析:

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(1)$ 不考虑结果字符串

T2. 对角线上不同值的数量差(Easy)

https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/

题解(前后缀分解)

第一次扫描增加正权,第二次扫描增加负权:

class Solution {
    fun differenceOfDistinctValues(grid: Array<IntArray>): Array<IntArray> {
        // 两次扫描
        val n = grid.size
        val m = grid[0].size
        val ret = Array(n) { IntArray(m) }
        
        for (row in 0 until n) {
            var i = row
            var j = 0
            val set = HashSet<Int>()
            while (i < n && j < m) {
                ret[i][j] += set.size
                set.add(grid[i][j])
                i++
                j++
            }
        }
        
        for (col in 1 until m) {
            var i = 0
            var j = col
            val set = HashSet<Int>()
            while (i < n && j < m) {
                ret[i][j] = set.size
                set.add(grid[i][j])
                i++
                j++
            }
        }

        for (row in 0 until n) {
            var i = row
            var j = m - 1
            val set = HashSet<Int>()
            while (i >= 0 && j >= 0) {
                ret[i][j] = Math.abs(ret[i][j] - set.size)
                set.add(grid[i][j])
                i--
                j--
            }
        }
        
        for (col in 0 until m - 1) {
            var i = n - 1
            var j = col
            val set = HashSet<Int>()
            while (i >= 0 && j >= 0) {
                ret[i][j] = Math.abs(ret[i][j] - set.size)
                set.add(grid[i][j])
                i--
                j--
            }
        }
        return ret
    }
}

复杂度分析:

  • 时间复杂度:$O(nm)$
  • 空间复杂度:$O(nm)$

T3. 使所有字符相等的最小成本(Medium)

https://leetcode.cn/problems/minimum-cost-to-make-all-characters-equal/

题解一(模拟)

从中间开始翻转,将不符合目标的字符向两端推,选择反转到 ‘1’ 和 ‘0’ 两个方案的最优解:

class Solution {
    
    private fun op(s:String, target:Char) :Long {
        val n = s.length
        var ret = 0L
        var flag = true
        for (i in n / 2 - 1 downTo 0) {
            if ((flag && s[i] != target) || (!flag && s[i] == target)) {
                ret += i + 1
                flag = !flag
            }
        }
        flag = true
        for (i in n / 2 until n) {
            if ((flag && s[i] != target) || (!flag && s[i] == target)) {
                ret += n - i
                flag = !flag
            }
        }
        return ret
    }
    
    fun minimumCost(s: String): Long {
        return Math.min(op(s,'0'), op(s,'1'))
    }
}

复杂度分析:

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

题解二(找规律)

当相邻字符串不相等时,必然需要反转。如果接近左边往左边翻转的成本更低,同时,如果接近右边,往右边翻转的成本更低。

class Solution {
    fun minimumCost(s: String): Long {
        val n = s.length
        var ret = 0L
        for (i in 1 until n) {
            if (s[i - 1] != s[i]) {
                ret += Math.min(i, n - i)
            }
        }
        return ret
    }
}

复杂度分析:

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

T4. 矩阵中严格递增的单元格数(Hard)

https://leetcode.cn/problems/maximum-strictly-increasing-cells-in-a-matrix/
  • 错误思路:

从最大值开始逆向推导,但是最优路径不一定会经过最大值。

  • 正确思路:

只有小的数字才能到大的数字,因此我们先将所有数字进行排序,对于每个数字储存其对应的所有位置。此时,每个位置的 LIS 最长序列长度只跟其排序前面的数字中位于同行和同列的数字有关,即前面数字且处于同行同列的最长路径 + 1。

class Solution {
    fun maxIncreasingCells(mat: Array<IntArray>): Int {
        val n = mat.size
        val m = mat[0].size
        var ret = 0
        // 排序
        val map = TreeMap<Int, MutableList<IntArray>>()
        for (i in 0 until n) {
            for (j in 0 until m) {
                map.getOrPut(mat[i][j]) { LinkedList<IntArray>() }.add(intArrayOf(i, j))
            }
        }
        val rowMax = IntArray(n)
        val colMax = IntArray(m)
        // 枚举
        for ((x, indexs) in map) {
            val mx = IntArray(indexs.size)
            // LIS
            for (i in indexs.indices) {
                mx[i] = Math.max(rowMax[indexs[i][0]], colMax[indexs[i][1]]) + 1
                ret = Math.max(ret, mx[i])
            }
            for (i in indexs.indices) {
                rowMax[indexs[i][0]] = Math.max(rowMax[indexs[i][0]], mx[i])
                colMax[indexs[i][1]] = Math.max(colMax[indexs[i][1]], mx[i])
            }
        }
        return ret
    }
}

复杂度分析:

  • 时间复杂度:$O(nm·lg(nm))$ 瓶颈在排序
  • 空间复杂度:$O(nm)$

往期回顾

标签:周赛,set,val,05,复杂度,ret,LIS,var,indexs
From: https://www.cnblogs.com/pengxurui/p/17438297.html

相关文章

  • 202305280952-《远程Linux服务器——安装tomcat8、jdk1.8、mysql5——mysql启动报错》
    在bash执行"systemctlstartmysqld"   提示:“Jobformysqld.servicefailedbecausethecontrolprocessexitedwitherrorcode.See"systemctlstatusmysqld.service"and"journalctl-xe"fordetails.”   /var/lib/mysql权......
  • 2023-05-27 量学基础 十八个涨停基因(转)
     涨停基因(一)——百日地量群涨停基因(二)——三大王牌柱涨停基因(三)——涨停板涨停基因(四)——跳空缺口涨停基因(五)——过左峰涨停基因(六)——长阴短柱涨停基因(七)——长阳矮柱涨停基因(八)——回踩精准线涨停基因(九)——假阴真阳涨停基因(十)——价升量缩涨停基因(十一)——倍量伸缩......
  • 2023-05 多校联合训练 HZNU站
    我想要原石然而,由于提瓦特大陆实在是太大了,游戏中设置了许多传送锚点。众所周知,每个传送锚点附近都有若干个原石(其实并没有),曾经有一位丰富经验的旅行者开辟了\(n−1\)条路和\(n\)个由路连通的传送锚点。为了便于后续的旅行者知道地图上原石的分布情况,他决定给旅行者一些提示......
  • 2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两
    2023-05-27:给你一个只包含小写英文字母的字符串s。每一次操作,你可以选择s中两个相邻的字符,并将它们交换。请你返回将s变成回文串的最少操作次数。注意,输入数据会确保s一定能变成一个回文串。输入:s="letelt"。输出:2。答案2023-05-27:大体过程如下:1.定义结......
  • 2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两
    2023-05-27:给你一个只包含小写英文字母的字符串s。每一次操作,你可以选择s中两个相邻的字符,并将它们交换。请你返回将s变成回文串的最少操作次数。注意,输入数据会确保s一定能变成一个回文串。输入:s="letelt"。输出:2。答案2023-05-27:大体过程如下:1.定义结构体Index......
  • 230526 // 小数论复习
    裁决已至!称量,你的罪恶!以此身,肃正万象!人总是越活越抽象的,所以怎么还不考期末,我要考期末!A.Minhttp://222.180.160.110:1024/contest/3641/problem/1给出\(n\)个数\(A_{1\simn}\),现求一组整数序列\(X_{1\simn}\)使得\(S=A_1\timesX_1+A_2\timesX_2+\cdots......
  • C语言课程设计[2023-05-27]
    C语言课程设计[2023-05-27]C语言课程设计综合性设计实验说明设计要求:(1)功能完备,实现用户需求(2)用户界面友好易用(3)必须调试通过,能够正常运行(4)驼峰命名、合理注释、模块化程序功能实现等规范化编程(5)保证源程序可读性。对系统常量等数据要求规范处理,对于常用......
  • C#实现的实验室(检验科)LIS信息系统
    1、技术框架(1)总体框架:SaaS架构的Client/Server应用服务可伸缩,多服务协同服务可拆分,功能易扩展(2)技术细节:体系结构:Client/Server架构客户端:WPF+WindowsForms服务端:C#+.Net数据库:Oracle接口技术:RESTfulAPI+Http+WCF2、LIS主要功能模块:报告管理模块、字典管理模块、医......
  • {{ form.as_ul }} – Render Django Forms as list
    DjangoformsareanadvancedsetofHTMLformsthatcanbecreatedusingpythonandsupportallfeaturesofHTMLformsinapythonicway.RenderingDjangoFormsinthetemplatemayseemmessyattimesbutwithproperknowledgeofDjangoFormsandattribut......
  • WPF 设置圆角窗体,通过ListView模拟下拉组合款
    界面:<Windowx:Class="WpfApp2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.micros......