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

【算法】【Python3、動態(tài)規(guī)劃、貪心、二分查找】力扣1671. 得到山形數(shù)組的最少刪除次數(shù)

這篇具有很好參考價值的文章主要介紹了【算法】【Python3、動態(tài)規(guī)劃、貪心、二分查找】力扣1671. 得到山形數(shù)組的最少刪除次數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1671. 得到山形數(shù)組的最少刪除次數(shù)


【算法】【動態(tài)規(guī)劃、貪心、二分查找】力扣1671. 得到山形數(shù)組的最少刪除次數(shù)

問題描述

給定一個整數(shù)數(shù)組 nums ,我們定義該數(shù)組為山形數(shù)組當且僅當:

  1. nums 的長度至少為 3。
  2. 存在一個下標 i 滿足 0 < i < len(nums) - 1 且:
    • nums[0] < nums[1] < ... < nums[i - 1] < nums[i]
    • nums[i] > nums[i + 1] > ... > nums[len(nums) - 1]

現(xiàn)在,給定整數(shù)數(shù)組 nums,我們的目標是將其變?yōu)樯叫螖?shù)組,問最少刪除多少個元素。

問題解析

正難則反,我們可以反過來思考原本的nums數(shù)組中能組成的最長的山形數(shù)組的子序列的長度是多少,最后將數(shù)組長度減去這個最長子序列的長度,即為最少刪除個數(shù)。顯然,這是一個最長上升子序列問題。

示例

示例 1:

輸入:nums = [1,3,1]
輸出:0
解釋:數(shù)組本身就是山形數(shù)組,無需刪除元素。

示例 2:

輸入:nums = [2,1,1,5,6,2,3,1]
輸出:3
解釋:一種方法是刪除下標為 0、1 和 5 的元素,得到山形數(shù)組 [1,5,6,3,1]。

解法一:動態(tài)規(guī)劃

class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        n = len(nums)
        # suf[i] 為以i為起點的后綴最長嚴格下降子序列的長度
        suf = [1] * n
        for i in range(n - 1, -1, -1):
            for j in range(i + 1, n):
                if nums[j] < nums[i]:
                    suf[i] = max(suf[i], suf[j] + 1)
        
        mx = 0
        pre = [1] * n
        for i in range(0, n):
            for j in range(i):
                if nums[j] < nums[i]:
                    pre[i] = max(pre[i], pre[j] + 1)
            if pre[i] >= 2 and suf[i] >= 2:
                mx = max(mx, pre[i] + suf[i] - 1)
        return n - mx

解法分析:

  • 構建兩個數(shù)組 presuf,分別表示以每個元素為起點的最長上升和下降子序列的長度。
  • 使用兩層嵌套循環(huán)更新 presuf 數(shù)組。
  • 尋找滿足條件的元素,計算最大山形數(shù)組長度,最終返回刪除元素的個數(shù)。

復雜度分析:

  • 時間復雜度: O ( n 2 ) O(n^2) O(n2)
  • 空間復雜度: O ( n ) O(n) O(n)

解法二:貪心 + 二分

class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        n = len(nums)
        suf = [0] * n
        g = []  # g[i] 代表最長上升子序列長度為 i + 1 的最小元素
        for i in range(n - 1, 0, -1):
            x = nums[i]
            j = bisect_left(g, x)  # 尋找第一個 >= x 的元素的下標
            if j == len(g):  # 代表沒有 >= x 的元素
                g.append(x)  # 添加 x 到 g
            else:
                g[j] = x  # 更新最小元素
            suf[i] = j + 1  # j + 1 代表了這個序列的長度。

        mx = 0
        g = []
        pre = 0
        for i in range(0, n, 1):
            x = nums[i]
            j = bisect_left(g, x)
            if j == len(g):
                g.append(x)
            else:
                g[j] = x
            pre = j + 1
            # 題目要求數(shù)組長度至少為3,
            # 也就是說,最簡單的山形數(shù)組的最大值在正中間,左右至少有一個元素
            # 能組成山形數(shù)組的子序列也要滿足這個要求
            # pre == 1代表左邊沒有元素,suf[i] == 1代表右邊沒有元素。
            if pre >= 2 and suf[i] >= 2:
                mx = max(mx, pre + suf[i] - 1)
        return len(nums) - mx

解法分析:

  • 利用貪心思想,維護一個輔助數(shù)組 g,其中 g[i] 代表最長上升子序列長度為 i + 1 的最小元素。
  • 使用二分查找更新 g 數(shù)組。
  • 遍歷數(shù)組,計算最大山形數(shù)組長度,最終返回刪除元素的個數(shù)。

復雜度分析:

  • 時間復雜度: O ( n l o g n ) O(n log n) O(nlogn)
  • 空間復雜度: O ( n ) O(n) O(n)

總結

本文介紹了解決力扣1671題的兩種方法:動態(tài)規(guī)劃和貪心 + 二分。動態(tài)規(guī)劃方法通過構建兩個輔助數(shù)組,分別表示以每個元素為起點的最長上升和下降子序列的長度,然后遍歷數(shù)組尋找滿足條件的元素,計算最大山形數(shù)組長度。貪心 + 二分方法則利用貪心思想和二分查找,維護一個輔助數(shù)組,遍歷數(shù)組計算最大山形數(shù)組長度。兩種方法的時間復雜度分別為 O(n^2) 和 O(n log n),空間復雜度均為 O(n)。在實際應用中,可以根據(jù)具體情況選擇適合的方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-800287.html

到了這里,關于【算法】【Python3、動態(tài)規(guī)劃、貪心、二分查找】力扣1671. 得到山形數(shù)組的最少刪除次數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 有效的括號字符串(力扣)動態(tài)規(guī)劃、貪心 JAVA

    有效的括號字符串(力扣)動態(tài)規(guī)劃、貪心 JAVA

    給你一個只包含三種字符的字符串,支持的字符類型分別是 ‘(’、‘)’ 和 ‘*’。請你檢驗這個字符串是否為有效字符串,如果是有效字符串返回true 。 有效字符串符合如下規(guī)則: 任何左括號 ‘(’ 必須有相應的右括號 ‘)’。 任何右括號 ‘)’ 必須有相應的左括號 ‘(’

    2024年02月14日
    瀏覽(32)
  • 【算法】在二維不單調(diào)的矩陣上二分查找——力扣1901. 尋找峰值 II

    1901. 尋找峰值 II 給定一個從0開始編號的m x n矩陣 mat ,其中任意兩個相鄰格子的值都不相同。峰值是指那些嚴格大于其相鄰格子(上、下、左、右)的元素。需要找出任意一個峰值 mat[i][j] 并返回其位置 [i, j] 。 示例 1: 示例 2: 步驟一:列轉行 首先,將矩陣的列轉換為行,表示為

    2024年02月03日
    瀏覽(22)
  • Offer必備算法_二分查找_八道力扣OJ題詳解(由易到難)

    Offer必備算法_二分查找_八道力扣OJ題詳解(由易到難)

    目錄 二分查找算法原理 ①力扣704. 二分查找 解析代碼 ②力扣34. 在排序數(shù)組中查找元素的第一個和最后一個位置 解析代碼 ③力扣69. x 的平方根? 解析代碼 ④力扣35. 搜索插入位置 解析代碼 ⑤力扣852. 山脈數(shù)組的峰頂索引 解析代碼 ⑥力扣162. 尋找峰值 解析代碼 ⑦力扣153. 尋

    2024年02月19日
    瀏覽(19)
  • LeetCode-1483. 樹節(jié)點的第 K 個祖先【樹 深度優(yōu)先搜索 廣度優(yōu)先搜索 設計 二分查找 動態(tài)規(guī)劃】

    LeetCode-1483. 樹節(jié)點的第 K 個祖先【樹 深度優(yōu)先搜索 廣度優(yōu)先搜索 設計 二分查找 動態(tài)規(guī)劃】

    給你一棵樹,樹上有 n 個節(jié)點,按從 0 到 n-1 編號。樹以父節(jié)點數(shù)組的形式給出,其中 parent[i] 是節(jié)點 i 的父節(jié)點。樹的根節(jié)點是編號為 0 的節(jié)點。 樹節(jié)點的第 k 個祖先節(jié)點是從該節(jié)點到根節(jié)點路徑上的第 k 個節(jié)點。 實現(xiàn) TreeAncestor 類: TreeAncestor(int n, int[] parent) 對樹和父

    2024年04月16日
    瀏覽(25)
  • 算法 - 動態(tài)規(guī)劃 / 貪心算法

    ?? ?? 121. 買賣股票的最佳時機 [數(shù)組] [股票] (動態(tài)規(guī)劃) ?? ?? 122. 買賣股票的最佳時機Ⅱ [數(shù)組] [股票] (動態(tài)規(guī)劃) ?? ?? 123. 買賣股票的最佳時機Ⅲ [數(shù)組] [股票] (動態(tài)規(guī)劃) ?? ?? 188. 買賣股票的最佳時機Ⅳ [數(shù)組] [股票] (動態(tài)規(guī)劃) ?? ?? 309. 買賣股票的最佳時機含冷凍

    2024年01月17日
    瀏覽(17)
  • 貪心算法和動態(tài)規(guī)劃

    貪心算法和動態(tài)規(guī)劃

    ? 目錄 一、簡介 二、貪心算法案例:活動選擇問題 1.原理介紹 三、動態(tài)規(guī)劃案例:背包問題 1.原理介紹 四、貪心算法與動態(tài)規(guī)劃的區(qū)別 五、總結 正則表達式-CSDN博客 深入理解HashMap:Java中的鍵值對存儲利器-CSDN博客 ? 貪心算法和動態(tài)規(guī)劃是兩種非常強大的算法設計策略,

    2024年02月05日
    瀏覽(21)
  • 【力扣·每日一題】2645. 構造有效字符串的最小插入數(shù)(動態(tài)規(guī)劃 貪心 滾動數(shù)組優(yōu)化 C++ Go)

    題目鏈接 給你一個字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母數(shù)。 如果字符串可以由 “abc” 串聯(lián)多次得到,則認為該字符串 有效 。 提示: 1 = w o r d . l e n g t h = 50 1 = word.length = 50 1 = w or d . l e n g t h = 50 w

    2024年01月16日
    瀏覽(26)
  • 四大算法:貪心、分治、回溯、動態(tài)規(guī)劃

    貪心算法(又稱貪婪算法),在求解問題時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優(yōu)解進行考慮,而是得到某種意義上的局部最優(yōu)解。 貪心算法采用自頂向下,以迭代的方法做出貪心選擇,每做一次貪心選擇,就將所求問題簡化為一個規(guī)模更小的問題。

    2024年02月15日
    瀏覽(145)
  • 動態(tài)規(guī)劃與貪心算法的區(qū)別

    動態(tài)規(guī)劃和貪心算法都是常見的算法設計技術,它們在很多問題中都有廣泛的應用。它們的區(qū)別在于: 貪心算法是一種貪心的策略,每一步都采用局部最優(yōu)的決策,最終得到全局最優(yōu)解。因此,貪心算法通常解決的是那些具有貪心選擇性質(zhì)的問題,即局部最優(yōu)解能導致全局最

    2024年02月12日
    瀏覽(23)
  • 【Python查找算法】二分查找、線性查找、哈希查找

    【Python查找算法】二分查找、線性查找、哈希查找

    目錄 1 二分查找算法 ?2 線性查找算法 3 哈希查找算法 ????????二分查找(Binary Search)是一種用于在有序數(shù)據(jù)集合中查找特定元素的高效算法。它的工作原理基于將數(shù)據(jù)集合分成兩半,然后逐步縮小搜索范圍,直到找到目標元素或確定目標元素不存在。 以下是二分查找的

    2024年02月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包