贪心算法 part01

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN;
        int count = 0;
        for (int i = 0; i < nums.size(); i++) {
            count += nums[i];
            if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)
                result = count;
            }
            if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
        }
        return result;
    }
};

455.分发饼干

sort(begin(),end())

然后匹配就行;(但是代码随想录想的是用大的满足,颠倒一下饼干和投喂小孩遍历顺序就行)

376. 摆动序列

我理解了,就算是递增序列也算2!!(题目理解存在问题!!)

cpp 复制代码
class Solution { 
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size() < 2) return nums.size(); // 处理边界情况
        int count = 0;  // 初始化
        int flag = 0;   // 初始状态
        
        for(int i = 1; i < nums.size(); i++) {
            int a = nums[i] - nums[i-1]; // 计算当前差值
            if(a > 0 && flag <= 0) {     // 形成上升摆动
                count++;
                flag = 1;               // 更新状态为上升
            } 
            else if(a < 0 && flag >= 0) { // 形成下降摆动
                count++;
                flag = -1;              // 更新状态为下降
            }
            // 当 a == 0 时,跳过,保持 flag 不变
        }
        return count+1; //我之前是 态势的比较,而元素需要+1; 
    }
};

代码随想录

53. 最大子序和

我这里相当于自动获取了最大数值;

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {

            int mmax = INT_MIN;
            int last=0;
            int sum=0;
            int flag=0;
            if(nums.size()==0) return 0;
            if(nums.size()==1) return nums[0];


            for(int i=0; i<nums.size();i++){
                if(nums[i]>mmax) mmax=nums[i]; //全局最大单数
                 last = max(sum,last); 
                sum+=nums[i];
                last = max(sum,last); //是否更新最大数值
                if(sum<=0) {flag=1; sum=0;}
            }


            if(flag==1&&last<=0) return mmax;
            else return max(mmax,last);
    }
};
cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int mmax = nums[0]; // 记录全局最大值
        int sum = 0;        // 记录当前子数组的和

        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];           // 累加当前元素
            mmax = max(mmax, sum);    // 更新全局最大值---自动获取了最大数值
            if (sum < 0) sum = 0;     // 当前和为负时,重置为 0
        }
        return mmax; // 返回最大子数组和
    }
};
相关推荐
雾月559 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
知来者逆2 小时前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊2 小时前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北2 小时前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈3 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing3 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD3 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘5 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV5 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8245 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode