贪心算法 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; // 返回最大子数组和
    }
};
相关推荐
int型码农3 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
UFIT3 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面3 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked933 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,3 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵3 小时前
有效的括号题解
数据结构·算法·
GIS小天4 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__4 小时前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
不忘不弃4 小时前
计算矩阵A和B的乘积
线性代数·算法·矩阵
不爱写代码的玉子4 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#