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

力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題)

這篇具有很好參考價(jià)值的文章主要介紹了力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題),# 力扣,leetcode,算法,職場(chǎng)和發(fā)展

組合數(shù)問(wèn)題

我們思考一下,如果要把數(shù)組分割成兩個(gè)子集,并且兩個(gè)子集的元素和相等,是否等價(jià)于在數(shù)組中尋找若干個(gè)數(shù)使之和等于所有數(shù)的一半?是的!

因此我們可以想到,兩種方式:

①回溯的方式找到target,但是回溯是階乘級(jí)別的算法,這里會(huì)超時(shí)。

②從前往后遍歷,形象說(shuō)明:定義n個(gè)集合dp[i],dp[i]表示前i個(gè)數(shù)的可能組合值,則有dp[i]={dp[i-1],dp[i-1]+i},dp[i-1]+i指的是i加上dp[i-1]中的所有元素得到的集合。同時(shí)由于長(zhǎng)度最長(zhǎng)200,數(shù)值最大為100,因此數(shù)的范圍最大為1<=i<=20000,因此最多只有20000個(gè)不同的數(shù)。因此dp最大為2W個(gè)數(shù)!所以我們可以用集合實(shí)現(xiàn),并且時(shí)間復(fù)雜度滿(mǎn)足要求O(nums.length*nums.length*max(nums[i]))!

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;
        for(auto &i:nums) sum+=i;
        if(sum&1||nums.size()==1) return false;//只有偶數(shù)總和可以
        sum>>=1;
        unordered_set<int> Set;
        vector<int> temp;
        for(auto &i:nums){
            if(i==sum) return true;
            for(auto it=Set.cbegin();it!=Set.cend();++it){
                int cur=*it+i;
                if(cur==sum) return true;
                if(cur<sum) temp.emplace_back(cur);//>sum的沒(méi)意義
            }
            for(auto & j:temp) Set.insert(j);
            temp.clear();
            Set.insert(i);
        }
        return false;
    }
};

遇到的問(wèn)題:

? ? ? ? 在循環(huán)遍歷的過(guò)程中往容器中插入元素會(huì)導(dǎo)致容器迭代器end()和size(),時(shí)刻發(fā)生變化。與此同時(shí),有的容器比如vector和string,往后面增加元素超過(guò)容量capacity可能會(huì)導(dǎo)致拷貝,從而整個(gè)迭代器失效。因此!在使用循環(huán)并且需要添加元素時(shí),想使用迭代器需要額外注意!

力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題),# 力扣,leetcode,算法,職場(chǎng)和發(fā)展

力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題),# 力扣,leetcode,算法,職場(chǎng)和發(fā)展

比如本題是先將所需增加的放入到一個(gè)vector中的。

我們不能企圖使用臨時(shí)“指針”迭代器i=end(),然后遍歷到it!=i,這是錯(cuò)誤的!因?yàn)閑nd()可能失效,而不是end()當(dāng)時(shí)指向的位置。以下是C++ prime中特地提到的(這么小,但又特別災(zāi)難的坑被遇到了)

力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題),# 力扣,leetcode,算法,職場(chǎng)和發(fā)展

int tmp=Set.size();
for(auto it=Set.cbegin();tmp!=0;++it,--tmp){ 
    int cur=*it+i;
    if(cur==sum) return true;
    temp.emplace_back(cur);
    Set.insert(cur);
}

這樣做仍然是錯(cuò)誤的,實(shí)際上我們?cè)谕琼樞蛉萜髦胁迦朐貢r(shí),容器的數(shù)據(jù)結(jié)構(gòu)會(huì)發(fā)生變化,因此導(dǎo)致++it可能并非按照原來(lái)的想法遍歷,所以是錯(cuò)誤的!

唯一正確且安全的方式是,如果需要在遍歷的時(shí)候同時(shí)添加元素,最好不要使用迭代器!迭代器可以很好的遍歷元素或者按迭代器范圍賦值。但是邊添加邊遍歷問(wèn)題非常大。

因此對(duì)于無(wú)序容器只能使用迭代器的情況下,使用臨時(shí)容器存儲(chǔ)是非常必要的;對(duì)于順序容器可以使用下標(biāo)的情況下,使用下標(biāo)更好。

動(dòng)態(tài)規(guī)劃

????????這道題實(shí)際上和0-1背包問(wèn)題很像,即從n個(gè)物品中拿出一部分使得其值剛好等于target。意識(shí)到這一點(diǎn)我們可以定義動(dòng)態(tài)轉(zhuǎn)移方程:

dp[i][k]=max(dp[i-1][k-nums[i]],dp[i-1][k]);

dp[0][nums[0]]=1;

//dp[i][k]表示拿前i個(gè)物品是否可以達(dá)到重量k。

????????這實(shí)際上和方法一組合數(shù)問(wèn)題是異曲同工的,方法一使用集合實(shí)現(xiàn),那么如果方法一使用的是數(shù)組實(shí)現(xiàn)呢?那么數(shù)組中標(biāo)記為1的實(shí)際上就是方法二的狀態(tài)了!

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;
        for(auto &i:nums) sum+=i;
        if(sum&1||nums.size()==1) return false;
        sum>>=1;
        vector<vector<int>> dp(nums.size(),vector<int>(sum+1,0));//超過(guò)sum實(shí)際上就不用看了
        if(nums[0]<=sum)
            dp[0][nums[0]]=1;
        for(int i=1;i<nums.size();++i){
            for(int j=1;j<=sum;++j){
                dp[i][j]=dp[i-1][j];
                if(j-nums[i]>=0)
                    dp[i][j]=max(dp[i-1][j-nums[i]],dp[i-1][j]);
            }
            if(nums[i]<=sum)
                dp[i][nums[i]]=1;
        }
        return dp[nums.size()-1][sum];
    }
};

由于只用到前面的值,很顯然我們可以降維優(yōu)化。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860549.html

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;
        for(auto &i:nums) sum+=i;
        if(sum&1||nums.size()==1) return false;
        sum>>=1;
        vector<int> dp(sum+1,0);//超過(guò)sum實(shí)際上就不用看了
        if(nums[0]<=sum)
            dp[nums[0]]=1;
        for(int i=1;i<nums.size();++i){
            for(int j=sum;j>=nums[i];--j){
                dp[j]=max(dp[j],dp[j-nums[i]]);
            }
        }
        return dp[sum];
    }
};

到了這里,關(guān)于力扣hot100:416.分割等和子集(組合/動(dòng)態(tài)規(guī)劃/STL問(wèn)題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問(wèn)題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問(wèn)題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    其他背包,面試幾乎不會(huì)問(wèn),都是競(jìng)賽級(jí)別的了,leetcode上連多重背包的題目都沒(méi)有,所以題庫(kù)也告訴我們,01背包和完全背包就夠用了。 而完全背包又是也是01背包稍作變化而來(lái),即:完全背包的物品數(shù)量是無(wú)限的。 01 背包問(wèn)題描述 有n件物品和一個(gè)最多能背重量為w 的背包

    2024年04月25日
    瀏覽(17)
  • 【十七】【動(dòng)態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    【十七】【動(dòng)態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

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

    2024年02月03日
    瀏覽(26)
  • 代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    說(shuō)到背包問(wèn)題大家都會(huì)想到使用動(dòng)規(guī)的方式來(lái)求解,那么為什么用動(dòng)規(guī)呢, dp數(shù)組代表什么呢 ? 初始化是什么 , 遍歷方式又是什么 ,這篇文章筆者將詳細(xì)講解背包問(wèn)題的經(jīng)典例題0-1背包問(wèn)題和完全背包問(wèn)題的解題方式,希望能幫助到大家 有人一提到背包問(wèn)題就只會(huì)使用動(dòng)態(tài)規(guī)劃來(lái)

    2024年02月06日
    瀏覽(124)
  • 第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    ● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 視頻講解:https://www.bilibili.com/video/BV1cg411g7Y6 1.確定dp數(shù)組以及下標(biāo)的含義 i是物品,j是背包容量

    2024年01月16日
    瀏覽(25)
  • 力扣算法刷題Day42|動(dòng)態(tài)規(guī)劃:01背包問(wèn)題 分割等和子集

    力扣題目:01背包問(wèn)題(二維數(shù)組) 刷題時(shí)長(zhǎng):參考題解 解題方法:動(dòng)態(tài)規(guī)劃 +?二維dp數(shù)組 復(fù)雜度分析 時(shí)間 空間 問(wèn)題總結(jié) 理解遞推公式困難 本題收獲 動(dòng)規(guī)思路:兩層for循環(huán),第一層i遍歷物品,第二層j枚舉背包容量以?xún)?nèi)所有值 確定dp數(shù)組及下標(biāo)的含義:dp[i][j] 表示從下標(biāo)

    2024年02月13日
    瀏覽(94)
  • 動(dòng)態(tài)規(guī)劃(分割等和子集)

    動(dòng)態(tài)規(guī)劃(分割等和子集)

    題目難易:中等 給定一個(gè)只包含正整數(shù)的非空數(shù)組。是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 注意: 每個(gè)數(shù)組中的元素不會(huì)超過(guò) 100 數(shù)組的大小不會(huì)超過(guò) 200 示例 1: 輸入: [1, 5, 11, 5] 輸出: true 解釋: 數(shù)組可以分割成 [1, 5, 5] 和 [11]. 示例 2: 輸入: [1, 2

    2024年02月02日
    瀏覽(24)
  • LeetCode416. 分割等和子集

    一、題目 給你一個(gè) 只包含正整數(shù) 的 非空 數(shù)組 nums 。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 示例 1: 示例 2: 提示: 1 = nums.length = 200 1 = nums[i] = 100 二、題解 方法一:0-1背包二維數(shù)組 步驟1:理解題目以及01 背包問(wèn)題 在 01 背包問(wèn)題中,

    2024年02月10日
    瀏覽(26)
  • 【LeetCode】416.分割等和子集

    給你一個(gè)? 只包含正整數(shù)? 的? 非空? 數(shù)組? nums ?。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 示例 1: 示例 2: 提示: 1 = nums.length = 200 1 = nums[i] = 100 實(shí)際上是求能否從背包里選取元素,使這些元素之和等于數(shù)組所有元素之和的一半。dp

    2024年02月11日
    瀏覽(27)
  • Leetcode 416 分割等和子集

    Leetcode 416 分割等和子集

    題意理解 : ????????給你一個(gè)? 只包含正整數(shù)? 的? 非空? 數(shù)組? nums ?。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 ? ? ? ? 即將數(shù)組的元素分成兩組,每組數(shù)值=sum(nums)/2 ? ? ? ? 若能分成這樣的兩組,則返回true,否則返回false ? ? ?

    2024年02月01日
    瀏覽(19)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】416、LeetCode分割等和子集

    【算法與數(shù)據(jù)結(jié)構(gòu)】416、LeetCode分割等和子集

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題可以抽象成一個(gè)01背包的問(wèn)題,關(guān)于01背包可以看【算法與數(shù)據(jù)結(jié)構(gòu)】算法與數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)。 本題只需要求出數(shù)組的累積和,然后和的一半就可以視為背包的最大重量,目標(biāo)

    2024年01月19日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包