国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LeetCode 周賽 347(2023/05/28)二維空間上的 LIS 最長(zhǎng)遞增子序列問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了LeetCode 周賽 347(2023/05/28)二維空間上的 LIS 最長(zhǎng)遞增子序列問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問(wèn)。

  • 往期回顧:LeetCode 單周賽第 346 場(chǎng) · 僅 68 人 AK 的最短路問(wèn)題

周賽 347 概覽

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

  • 標(biāo)簽:模擬、字符串

T2. 對(duì)角線上不同值的數(shù)量差(Easy)

  • 標(biāo)簽:前后綴分解

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

  • 標(biāo)簽:模擬、貪心

T4. 矩陣中嚴(yán)格遞增的單元格數(shù)(Hard)

  • 標(biāo)簽:排序、動(dòng)態(tài)規(guī)劃

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()
    }
}

基于正則表達(dá)式匹配:

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

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:$O(n)$
  • 空間復(fù)雜度:$O(1)$ 不考慮結(jié)果字符串

T2. 對(duì)角線上不同值的數(shù)量差(Easy)

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

題解(前后綴分解)

第一次掃描增加正權(quán),第二次掃描增加負(fù)權(quán):

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
    }
}

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:$O(nm)$
  • 空間復(fù)雜度:$O(nm)$

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

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

題解一(模擬)

從中間開(kāi)始翻轉(zhuǎn),將不符合目標(biāo)的字符向兩端推,選擇反轉(zhuǎn)到 ‘1’ 和 ‘0’ 兩個(gè)方案的最優(yōu)解:

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'))
    }
}

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:$O(n)$
  • 空間復(fù)雜度:$O(1)$

題解二(找規(guī)律)

當(dāng)相鄰字符串不相等時(shí),必然需要反轉(zhuǎn)。如果接近左邊往左邊翻轉(zhuǎn)的成本更低,同時(shí),如果接近右邊,往右邊翻轉(zhuǎn)的成本更低。

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
    }
}

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:$O(n)$
  • 空間復(fù)雜度:$O(1)$

T4. 矩陣中嚴(yán)格遞增的單元格數(shù)(Hard)

https://leetcode.cn/problems/maximum-strictly-increasing-cells-in-a-matrix/
  • 錯(cuò)誤思路:

從最大值開(kāi)始逆向推導(dǎo),但是最優(yōu)路徑不一定會(huì)經(jīng)過(guò)最大值。

  • 正確思路:

只有小的數(shù)字才能到大的數(shù)字,因此我們先將所有數(shù)字進(jìn)行排序,對(duì)于每個(gè)數(shù)字儲(chǔ)存其對(duì)應(yīng)的所有位置。此時(shí),每個(gè)位置的 LIS 最長(zhǎng)序列長(zhǎng)度只跟其排序前面的數(shù)字中位于同行和同列的數(shù)字有關(guān),即前面數(shù)字且處于同行同列的最長(zhǎng)路徑 + 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
    }
}

復(fù)雜度分析:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462167.html

  • 時(shí)間復(fù)雜度:$O(nm·lg(nm))$ 瓶頸在排序
  • 空間復(fù)雜度:$O(nm)$

往期回顧

  • LeetCode 單周賽第 346 場(chǎng) · 僅 68 人 AK 的最短路問(wèn)題
  • LeetCode 單周賽第 345 場(chǎng) · 體驗(yàn)一題多解的算法之美
  • LeetCode 雙周賽第 104 場(chǎng) · 流水的動(dòng)態(tài)規(guī)劃,鐵打的結(jié)構(gòu)化思考
  • LeetCode 雙周賽第 103 場(chǎng) · 區(qū)間求和的樹狀數(shù)組經(jīng)典應(yīng)用

到了這里,關(guān)于LeetCode 周賽 347(2023/05/28)二維空間上的 LIS 最長(zhǎng)遞增子序列問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LeetCode 雙周賽 104(2023/05/13)流水的動(dòng)態(tài)規(guī)劃,鐵打的結(jié)構(gòu)化思考

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問(wèn)。 往期回顧:LeetCode 單周賽第 344 場(chǎng) · 手寫遞歸函數(shù)的通用套路 T1. 老人的數(shù)目(Easy) 標(biāo)簽:模擬、計(jì)數(shù) T2. 矩陣中的和(Medium) 標(biāo)簽:模擬、排序 T3. 最大或值(Medium) 標(biāo)簽:動(dòng)態(tài)規(guī)劃、前后綴分解

    2024年02月04日
    瀏覽(52)
  • 周賽347(模擬、思維題、動(dòng)態(tài)規(guī)劃+優(yōu)化)

    周賽347(模擬、思維題、動(dòng)態(tài)規(guī)劃+優(yōu)化)

    難度簡(jiǎn)單1 給你一個(gè)用字符串表示的正整數(shù) num ,請(qǐng)你以字符串形式返回不含尾隨零的整數(shù) num 。 示例 1: 示例 2: 提示: 1 = num.length = 1000 num 僅由數(shù)字 0 到 9 組成 num 不含前導(dǎo)零 模擬 難度中等4 給你一個(gè)下標(biāo)從 0 開(kāi)始、大小為 m x n 的二維矩陣 grid ,請(qǐng)你求解大小同樣為 m x

    2024年02月06日
    瀏覽(21)
  • Leetcode周賽 | 2023-7-23

    Leetcode周賽 | 2023-7-23

    01背包啊。01背包??!怎么能一直往回溯上想!還是對(duì)動(dòng)態(tài)規(guī)劃太不熟悉了!這不就是01背包嗎?還要?jiǎng)e人提示才知道。 哈希,用雙指針應(yīng)該也可以。 也是動(dòng)態(tài)規(guī)劃??!怎么能又想回溯!這道題如果兩層遍歷會(huì)超時(shí),要保存前面遍歷過(guò)的,當(dāng)前點(diǎn)為奇數(shù)的最大值,和當(dāng)前點(diǎn)為

    2024年02月16日
    瀏覽(21)
  • LeetCode 雙周賽 106(2023/06/10)兩道思維題

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 加入知識(shí)星球提問(wèn)。 往期回顧:LeetCode 單周賽第 348 場(chǎng) · 數(shù)位 DP 模版學(xué)會(huì)了嗎? T1. 判斷一個(gè)數(shù)是否迷人(Easy) 標(biāo)簽:計(jì)數(shù) T2. 找到最長(zhǎng)的半重復(fù)子字符串(Medium) 標(biāo)簽:同向雙指針 T3. 移動(dòng)機(jī)器人(Medi

    2024年02月08日
    瀏覽(24)
  • LeetCode 周賽 343(2023/04/30)結(jié)合「下一個(gè)排列」的貪心構(gòu)造問(wèn)題

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問(wèn)。 大家好,我是小彭。 今天是五一假期的第二天,打周賽的人數(shù)比前一天的雙周賽多了,難道大家都只玩一天嗎?這場(chǎng)周賽是 LeetCode 第 343 場(chǎng)單周賽,如果不考慮第一題擺爛的翻譯,整體題目質(zhì)量還是

    2024年02月02日
    瀏覽(21)
  • LeetCode 雙周賽 103(2023/04/29)區(qū)間求和的樹狀數(shù)組經(jīng)典應(yīng)用

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問(wèn)。 大家好,我是小彭。 這場(chǎng)周賽是 LeetCode 雙周賽第 103 場(chǎng),難得在五一假期第一天打周賽的人數(shù)也沒(méi)有少太多。這場(chǎng)比賽前 3 題比較簡(jiǎn)單,我們把篇幅留給最后一題。 往期周賽回顧:LeetCode 單周賽第

    2024年02月02日
    瀏覽(23)
  • LeetCode 周賽 342(2023/04/23)容斥原理、計(jì)數(shù)排序、滑動(dòng)窗口、子數(shù)組 GCB

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問(wèn)題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問(wèn)。 大家好,我是小彭。 前天剛舉辦 2023 年力扣杯個(gè)人 SOLO 賽,昨天周賽就出了一場(chǎng) Easy - Easy - Medium - Medium 的水場(chǎng),不得不說(shuō) LeetCode 是懂禮數(shù)的 ??。 接下來(lái),請(qǐng)你跟著小彭的思路,一步步將問(wèn)題做難,

    2023年04月24日
    瀏覽(24)
  • 2023-08-28 LeetCode每日一題(插入?yún)^(qū)間)

    2023-08-28 LeetCode每日一題(插入?yún)^(qū)間)

    點(diǎn)擊跳轉(zhuǎn)到題目位置 給你一個(gè) 無(wú)重疊的 ,按照區(qū)間起始端點(diǎn)排序的區(qū)間列表。 在列表中插入一個(gè)新的區(qū)間,你需要確保列表中的區(qū)間仍然有序且不重疊(如果有必要的話,可以合并區(qū)間)。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 0 = intervals.length = 10 4 interval

    2024年02月11日
    瀏覽(28)
  • 2023-07-28 LeetCode每日一題(并行課程 III)

    2023-07-28 LeetCode每日一題(并行課程 III)

    點(diǎn)擊跳轉(zhuǎn)到題目位置 給你一個(gè)整數(shù) n ,表示有 n 節(jié)課,課程編號(hào)從 1 到 n 。同時(shí)給你一個(gè)二維整數(shù)數(shù)組 relations ,其中 relations[j] = [prevCourse j , nextCourse j ] ,表示課程 prevCoursej 必須在課程 nextCourse j 之前 完成(先修課的關(guān)系)。同時(shí)給你一個(gè)下標(biāo)從 0 開(kāi)始的整數(shù)數(shù)組 time ,其

    2024年02月15日
    瀏覽(22)
  • 【LeetCode每日一題合集】2023.8.28-2023.9.3(到家的最少跳躍次數(shù))

    【LeetCode每日一題合集】2023.8.28-2023.9.3(到家的最少跳躍次數(shù))

    https://leetcode.cn/problems/insert-interval/ 提示: 0 = intervals.length = 10^4 intervals[i].length == 2 0 = intervals[i][0] = intervals[i][1] = 10^5 intervals 根據(jù) intervals[i][0] 按 升序 排列 newInterval.length == 2 0 = newInterval[0] = newInterval[1] = 10^5 當(dāng)前區(qū)間與要加入的新區(qū)間之間的關(guān)系只有兩種可能:相交或者不相

    2024年02月09日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包