贪心算法 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; // 返回最大子数组和
    }
};
相关推荐
半盏茶香21 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
CodeJourney.40 分钟前
小型分布式发电项目优化设计方案
算法
带多刺的玫瑰1 小时前
Leecode刷题C语言之从栈中取出K个硬币的最大面积和
数据结构·算法·图论
Cando学算法1 小时前
Codeforces Round 1000 (Div. 2)(前三题)
数据结构·c++·算法
薯条不要番茄酱1 小时前
【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
算法·动态规划
小林熬夜学编程1 小时前
【Python】第三弹---编程基础进阶:掌握输入输出与运算符的全面指南
开发语言·python·算法
字节高级特工1 小时前
【优选算法】5----有效三角形个数
c++·算法
小孟Java攻城狮7 小时前
leetcode-不同路径问题
算法·leetcode·职场和发展
查理零世7 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分
小猿_0010 小时前
C语言程序设计十大排序—插入排序
c语言·算法·排序算法