贪心算法 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; // 返回最大子数组和
    }
};
相关推荐
其实防守也摸鱼12 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt12 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one16 小时前
递归算法(一)
java·开发语言·算法
风影同志7832417 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG18 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者18 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者19 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi666819 小时前
PID——算法改进
算法
一只不想敲代码的程序猿20 小时前
如何更高效地拆解问题?
算法