周三,课都在下午。
下午还是先刷题:
- 可被三整除的最大和
给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。
总和模 3 结果 调整目标 具体策略
0 无需调整 直接返回 total
1 让总和减 1(模 3 为 0) 两种可选策略,选「移除代价更小」的:
1. 移除 mod1中最小的 1 个元素;
2. 移除 mod2 中最小的 2 个元素(因为 2+2=4 ≡1 mod3);(若两种都可行,选移除元素和更小的;若都不可行,说明无有效子集,返回 0)
2 让总和减 2(模 3 为 0) 两种可选策略,选「移除代价更小」的:
1. 移除 mod2 中最小的 1 个元素;
2. 移除 mod1中最小的 2 个元素(因为 1+1=2 ≡2 mod3);(同理,选代价更小的,都不可行则返回 0)
int maxSumDivThree(vector<int>& nums) {
vector<int> m0;
vector<int> m1;
vector<int> m2;
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum=sum+nums[i];
if(nums[i]%3==0)
{
m0.push_back(nums[i]);
}
else if(nums[i]%3==1)
{
m1.push_back(nums[i]);
}
else if(nums[i]%3==2)
{
m2.push_back(nums[i]);
}
}
sort(m1.begin(),m1.end());
sort(m2.begin(),m2.end());
int res=0;
if(sum%3==0)
{
return sum;
}
else if(sum%3==1)
{
// 策略1:移除m1中最小的1个元素(需m1至少1个)
if (m1.size() >= 1) {
res = max(res, sum - m1[0]);
}
// 策略2:移除m2中最小的2个元素(需m2至少2个)
if (m2.size() >= 2) {
res = max(res, sum - (m2[0] + m2[1]));
}
}
else if(sum%3==2)
{
// 策略1:移除m2中最小的1个元素(需m2至少1个)
if (m2.size() >= 1) {
res = max(res, sum - m2[0]);
}
// 策略2:移除m1中最小的2个元素(需m1至少2个)
if (m1.size() >= 2) {
res = max(res, sum - (m1[0] + m1[1]));
}
}
return max(res,0);
}
自己写肯定是感觉有难度,但是看了之后觉得思路还算是清晰的,上面的表格也是列出来了。
主要的条件还算这个边界条件的判断,这边用max去处理,还算比较巧妙的,自己写的话,就是要自己去一个个去判断条件了。
这边还能写个动态规划都看看吧
vector<int> dp={0,INT_MIN,INT_MIN};
for(int i=0;i<nums.size();i++)
{
vector<int> new_dp=dp;
int num=nums[i];
if(num%3==0) // 余数0:加num后余数不变
{
new_dp[0]=max(dp[0],dp[0]+num);
new_dp[1]=max(dp[1],dp[1]+num);
new_dp[2]=max(dp[2],dp[2]+num);
}
else if(num%3==1)// 余数1:dp[0]+num→余数1;dp[1]+num→余数2;dp[2]+num→余数0
{
new_dp[0]=max(dp[0],dp[2]+num);
new_dp[1]=max(dp[1],dp[0]+num);
new_dp[2]=max(dp[2],dp[1]+num);
}
else// 余数2:dp[0]+num→余数2;dp[1]+num→余数0;dp[2]+num→余数1
{
new_dp[0]=max(dp[0],dp[1]+num);
new_dp[1]=max(dp[1],dp[2]+num);
new_dp[2]=max(dp[2],dp[0]+num);
}
dp=new_dp;
}
return max(dp[0],0);
这种分情况看的东西感觉还是好理解一些的。
这边就是每次更新这个dp数值,同时,每次dp和new_dp都要继承一下的,最后找余数为0的dp。
这个题还是挺有价值的,就是要去看不同的策略去寻找结果,而且在评论区也看到了不少的人说是面试题,这边也有2种方法去实现,贪心和动态规划,都实现了一下。
然后就是去复习那个最优化了,最优化相对于随机过程要简单一些,因为考试内容平常都练过了,学习也有目标。
把那个可行方向和下降方向给搞清楚了。
然后晚上有计网和随机过程。
计网课上玩了一节课,然后学了一节课,看了下泊松过程的其他题目。
晚上随机过程,边听边学,算是回顾了一下马氏链的内容,再看了一些题。