739每日溫度;416分割等和子集

根據每日 氣溫 列表,請重新生成一個列表,對應位置的輸出是需要再等待多久溫度纔會升高超過該日的天數。如果之後都不會升高,請在該位置用 0 來代替。

例如,給定一個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:氣溫 列表長度的範圍是 [1, 30000]。每個氣溫的值的均爲華氏度,都是在 [30, 100] 範圍內的整數。

class Solution {//單調遞減棧
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        int tSize=T.size();
        if(tSize==0)return {};
        stack<int>st;
        vector<int>res(tSize);
        st.push(0);
        for(int i=1;i<tSize;++i){
            while(st.size()&&T[i]>T[st.top()]){
                res[st.top()]=i-st.top();
                st.pop();
            }
            st.push(i);
        }
        return res;
    }
};

給定一個只包含正整數的非空數組。是否可以將這個數組分割成兩個子集,使得兩個子集的元素和相等。

注意:


    每個數組中的元素不會超過 100
    數組的大小不會超過 200


示例 1:

輸入: [1, 5, 11, 5]

輸出: true

解釋: 數組可以分割成 [1, 5, 5] 和 [11].


 

示例 2:

輸入: [1, 2, 3, 5]

輸出: false

解釋: 數組不能分割成兩個元素和相等的子集.

class Solution {//動態規劃 二維 dp[i][j]:nums[0~i]存在一個集合使得總和爲j
public:
    bool canPartition(vector<int>& nums) {
        int nSize=nums.size();
        if(nSize<=1)return false;
        int target=accumulate(nums.begin(),nums.end(),0);
        if(target%2!=0)return false;
        target=target>>1;
        vector<vector<bool>>dp(nSize,vector<bool>(target+1,0));
        for(int i=0;i<nSize;++i)
            dp[i][0]=true;
        for(int i=1;i<nSize;++i){
            for(int j=0;j<=target;++j){
                if(j>=nums[i])
                    dp[i][j]=dp[i-1][j]|dp[i-1][j-nums[i]];
                else
                    dp[i][j]=dp[i-1][j];
            }
        }
        return dp[nSize-1][target];
    }
};
class Solution {//動態規劃 一維
public:
    bool canPartition(vector<int>& nums) {
        int nSize=nums.size();
        if(nSize<=1)return false;
        int target=accumulate(nums.begin(),nums.end(),0);
        if(target%2!=0)return false;
        target=target>>1;
        vector<bool>dp(target+1,0);
        dp[0]=true;
        for(int i=0;i<nSize;++i)
            for(int j=target;j>=0;--j)//
                if(j>=nums[i])
                    dp[j]=dp[j]|dp[j-nums[i]];
        return dp[target];
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章