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

力扣第474題 一和零 c++ 動態(tài)規(guī)劃 01背包

這篇具有很好參考價值的文章主要介紹了力扣第474題 一和零 c++ 動態(tài)規(guī)劃 01背包。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題目

474. 一和零

中等

相關標簽

數組? ?字符串? ?動態(tài)規(guī)劃

給你一個二進制字符串數組?strs?和兩個整數?m?和?n?。

請你找出并返回?strs?的最大子集的長度,該子集中?最多?有?m?個?0?和?n?個?1?。

如果?x?的所有元素也是?y?的元素,集合?x?是集合?y?的?子集?。

示例 1:

輸入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
輸出:4
解釋:最多有 5 個 0 和 3 個 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他滿足題意但較小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不滿足題意,因為它含 4 個 1 ,大于 n 的值 3 。

示例 2:

輸入:strs = ["10", "0", "1"], m = 1, n = 1
輸出:2
解釋:最大的子集是 {"0", "1"} ,所以答案是 2 。

提示:

  • 1 <= strs.length <= 600
  • 1 <= strs[i].length <= 100
  • strs[i]?僅由?'0'?和?'1'?組成
  • 1 <= m, n <= 100

思路和解題方法

  • 定義一個二維動態(tài)規(guī)劃數組?dp,其中?dp[i][j]?表示當背包容量為?i?個 0 和?j?個 1 時,所能選擇的字符串的最大數量。
  • 對于每個字符串?str,統(tǒng)計其中 0 和 1 的數量,分別記為?zeroNum?和?oneNum。
  • 使用雙重循環(huán)遍歷背包容量?i?和?j,從大到小遍歷,以確保在更新?dp[i][j]?時使用的是上一輪循環(huán)中的值。具體地,在第二重循環(huán)中,對于當前的?i?和?j,有兩種選擇:
    • 不選擇當前字符串,此時?dp[i][j]?不變;
    • 選擇當前字符串,此時需要將?i?減去?zeroNum,將?j?減去?oneNum,并將?dp[i-zeroNum][j-oneNum]?加上 1,表示選擇當前字符串后的最大數量。
  • 在雙重循環(huán)結束后,dp[m][n]?即為所求。

復雜度

????????時間復雜度:

????????????????O(k*m*n)

????????時間復雜度:該算法使用了二維動態(tài)規(guī)劃數組,對于每個字符串需要遍歷一次整個數組,因此時間復雜度為 O(k * m * n),其中 k =?len(strs) 表示字符串數組的長度。

????????空間復雜度

????????????????O(m*n)

????????空間復雜度:該算法使用了一個二維動態(tài)規(guī)劃數組,因此空間復雜度為 O(m * n)。需要注意的是,在實際代碼中,我們可以將二維數組優(yōu)化為一維數組,從而將空間復雜度降低到 O(n)。

c++ 代碼

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        // 創(chuàng)建動態(tài)規(guī)劃數組 dp,大小為 (m+1) x (n+1),并將所有元素初始化為 0
        vector<vector<int>> dp (m+1,vector<int> (n+1,0));
        
        // 遍歷字符串數組 strs
        for(string str :strs)
        {
            // 統(tǒng)計當前字符串中 0 和 1 的個數
            int oneNum = 0,zeroNum = 0;
            for(char c:str) if(c == '0') zeroNum++; else oneNum++;
            
            // 使用雙重循環(huán)遍歷動態(tài)規(guī)劃數組 dp
            for(int i = m;i>=zeroNum;i--) // 遍歷背包容量 m
                for(int j = n;j>=oneNum;j--) // 遍歷背包容量 n
                {
                    // 如果當前字符串可以被放入背包中,更新 dp[i][j] 的值為 dp[i-zeroNum][j-oneNum] + 1
                    // 表示容量為 i、j 的背包所能裝載的最大字符串數量
                    dp[i][j] = max(dp[i][j],dp[i-zeroNum][j-oneNum] + 1);
                }
        }
        
        // 返回容量為 m、n 的背包所能裝載的最大字符串數量
        return dp[m][n];
    }
};

覺得有用的話可以點點贊,支持一下。

如果愿意的話關注一下。會對你有更多的幫助。

每天都會不定時更新哦? >人<? 。文章來源地址http://www.zghlxwxcb.cn/news/detail-741470.html

到了這里,關于力扣第474題 一和零 c++ 動態(tài)規(guī)劃 01背包的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

  • 【十九】【動態(tài)規(guī)劃】518. 零錢兌換 II、279. 完全平方數、474. 一和零,三道題目深度解析

    【十九】【動態(tài)規(guī)劃】518. 零錢兌換 II、279. 完全平方數、474. 一和零,三道題目深度解析

    動態(tài)規(guī)劃就像是解決問題的一種策略,它可以幫助我們更高效地找到問題的解決方案。這個策略的核心思想就是將問題分解為一系列的小問題,并將每個小問題的解保存起來。這樣,當我們需要解決原始問題的時候,我們就可以直接利用已經計算好的小問題的解,而不需要重

    2024年02月03日
    瀏覽(25)
  • Day43|動態(tài)規(guī)劃part05: 1049. 最后一塊石頭的重量 II、494. 目標和、474. 一和零

    本題物品的重量為stones[i],物品的價值也為stones[i]。 對應著01背包里的物品重量weight[i]和 物品價值value[i]。 確定dp數組以及下標的含義 dp[j]表示容量(這里說容量更形象,其實就是重量)為j的背包,最多可以背最大重量為dp[j] 。 確定遞推公式 01背包的遞推公式為:dp[j] = ma

    2024年04月23日
    瀏覽(25)
  • 【LeetCode題目詳解】第九章 動態(tài)規(guī)劃 part05 1049. 最后一塊石頭的重量 II 494. 目標和 474.一和零(day43補)

    【LeetCode題目詳解】第九章 動態(tài)規(guī)劃 part05 1049. 最后一塊石頭的重量 II 494. 目標和 474.一和零(day43補)

    有一堆石頭,用整數數組? stones 表示。其中? stones[i] 表示第 i 塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設石頭的重量分別為? x 和? y ,且? x = y 。那么粉碎的可能結果如下: 如果? x == y ,那么兩塊石頭都會被完全粉碎; 如果? x != y

    2024年02月09日
    瀏覽(25)
  • 代碼隨想錄Day36 動態(tài)規(guī)劃05 LeetCode T1049最后一塊石頭的重量II T494 目標和 T474 一和零

    代碼隨想錄Day36 動態(tài)規(guī)劃05 LeetCode T1049最后一塊石頭的重量II T494 目標和 T474 一和零

    理論基礎? :?代碼隨想錄Day34 LeetCode T343整數拆分 T96 不同的二叉搜索樹-CSDN博客 1.明白dp數組的含義 2.明白遞推公式的含義 3.初始化dp數組 4.注意dp數組的遍歷順序 5.打印dp數組排錯 題目鏈接:1049. 最后一塊石頭的重量 II - 力扣(LeetCode) 這題我們仍然采用動規(guī)五部曲來寫,這題和

    2024年02月06日
    瀏覽(19)
  • 算法學習——LeetCode力扣動態(tài)規(guī)劃篇3(494. 目標和、474. 一和零、518. 零錢兌換 II)

    算法學習——LeetCode力扣動態(tài)規(guī)劃篇3(494. 目標和、474. 一和零、518. 零錢兌換 II)

    494. 目標和 - 力扣(LeetCode) 描述 給你一個非負整數數組 nums 和一個整數 target 。 向數組中的每個整數前添加 ‘+’ 或 ‘-’ ,然后串聯起所有整數,可以構造一個 表達式 : 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串聯起來得到表達式 “

    2024年04月14日
    瀏覽(70)
  • 【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標和、零一和)

    【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標和、零一和)

    力扣題目鏈接(opens new window) 難度:中等 給定一個非負整數數組,a1, a2, ..., an, 和一個目標數,S?,F在你有兩個符號 + 和 -。對于數組中的任意一個整數,你都可以從 + 或 -中選擇一個符號添加在前面。 返回可以使最終數組和為目標數 S 的所有添加符號的方法數。 示例: 輸入

    2023年04月18日
    瀏覽(87)
  • 474. 一和零

    目錄 1、題目描述 2、思路:動態(tài)規(guī)劃01背包 2.1、確定dp數組及下標含義 2.2、確定遞歸數組 2.3、初始化 2.4、確定遍歷順序 給你一個二進制字符串數組 strs 和兩個整數 m 和 n 。 請你找出并返回 strs 的最大子集的長度,該子集中 最多 有 m 個 0 和 n 個 1 。 如果 x 的所有元素也是

    2024年02月03日
    瀏覽(20)
  • Leetcode 474 一和零

    題意理解 : ????????給你一個二進制字符串數組? strs ?和兩個整數? m ?和? n ?。 ????????請你找出并返回? strs ?的最大子集的長度,該子集中? 最多 ?有? m ?個? 0 ?和? n ?個? 1 ?。 ????????如果? x ?的所有元素也是? y ?的元素,集合? x ?是集合? y ?的?

    2024年01月17日
    瀏覽(19)
  • 【算法與數據結構】474、LeetCode一和零

    【算法與數據結構】474、LeetCode一和零

    所有的LeetCode題解索引,可以看這篇文章——【算法和數據結構】LeetCode題解。 ?? 思路分析 :本題要找strs數組的最大子集,這個子集最多含有 m m m 個0和 n n n 個1。本題也可以抽象成一個01背包的問題。其中,strs內的元素就是物品,而 m m m 和 n n n 就是背包的維度。 d p [

    2024年01月22日
    瀏覽(26)
  • 力扣:494. 目標和(動態(tài)規(guī)劃)(01背包)

    力扣:494. 目標和(動態(tài)規(guī)劃)(01背包)

    給你一個非負整數數組 nums 和一個整數 target 。 向數組中的每個整數前添加 ‘+’ 或 ‘-’ ,然后串聯起所有整數,可以構造一個 表達式 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串聯起來得到表達式 “+2-1” 。 返回可以通過上述方法構造的

    2024年01月21日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包