根據每日 氣溫 列表,請重新生成一個列表,對應位置的輸出是需要再等待多久溫度纔會升高超過該日的天數。如果之後都不會升高,請在該位置用 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];
}
};