2025-12-17小记

周三,课都在下午。

下午还是先刷题:

  1. 可被三整除的最大和
    给你一个整数数组 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种方法去实现,贪心和动态规划,都实现了一下。

然后就是去复习那个最优化了,最优化相对于随机过程要简单一些,因为考试内容平常都练过了,学习也有目标。
把那个可行方向和下降方向给搞清楚了。

然后晚上有计网和随机过程。

计网课上玩了一节课,然后学了一节课,看了下泊松过程的其他题目。

晚上随机过程,边听边学,算是回顾了一下马氏链的内容,再看了一些题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 通用编程概念 变量与可变性 变量默认不可变,如需要改变,可在变量名前加 mut 使其可变。例如:let mut a...
    soojade阅读 14,304评论 2 30
  • 最近在科研中使用到元分析,零零散散开始接触一些理论与实现。元分析的主要作用就是汇总某一个方面所有符合条件研究的统计...
    王诗翔阅读 18,547评论 5 21
  • 一、简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同...
    想聽丿伱說衹愛我阅读 3,505评论 0 1
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,933评论 0 160
  • Q.1. Python 的特点和优点是什么? Python 可以作为编程的入门语言,因为他具备以下特质:1.解释性...
    6bca7c813977阅读 4,328评论 0 0

友情链接更多精彩内容