代码随想录笔记--贪心算法篇

1--贪心算法

主要思路:

通过局部最优推导全局最优;

2--分发饼干

主要思路:

基于贪心算法,每次都尽可能用大的饼干去喂胃口大的孩子,贪心地节省饼干;

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

class Solution {
public:
    int findContentChildren(std::vector<int>& g, std::vector<int>& s) {
        if(s.size() == 0) return 0;
        // 从小到大排序饼干
        std::sort(g.begin(), g.end());
        std::sort(s.begin(), s.end());
        
        int res = 0; // 结果
        int cookie_idx = s.size() - 1; // 从最后一个饼干开始分发

        // 贪心地每次用大饼干去喂胃口大的孩子
        for(int child_idx = g.size() - 1; child_idx >= 0; child_idx--){
            if(cookie_idx >= 0 && s[cookie_idx] >= g[child_idx]){ // 饼干能满足孩子的胃口
                res++;
                cookie_idx--;
            }
        }
        return res;
    }
};

int main(int argc, char* argv[]){
    // g = [1,2,3], s = [1,1]
    std::vector<int> child = {1, 2, 3};
    std::vector<int> cookie = {1, 1};
    Solution S1;
    int res = S1.findContentChildren(child, cookie);
    std::cout << res << std::endl;
    return 0;
}

3--摆动序列

主要思路:
基于贪心算法,贪心地计算山谷和山峰的个数;

cpp 复制代码
#include <iostream>
#include <vector>

class Solution {
public:
    int wiggleMaxLength(std::vector<int>& nums) {
        int pre_diff = 0;
        int cur_diff = 0;
        int result = 1; // 默认最右边元素是一个摆动
        for(int i = 0; i < nums.size() - 1; i++){
            cur_diff = nums[i+1] - nums[i];
            if(pre_diff <= 0 && cur_diff > 0 || pre_diff >= 0 && cur_diff < 0){
                result ++;
                pre_diff = cur_diff; // 产生摆动才更新 pre_diff 避免平波递增的情况
            }
        }
        return result;
    }
};

int main(int argc, char* argv[]){
    // nums = [1,7,4,9,2,5]
    std::vector<int> test = {1, 7, 4, 9, 2, 5};
    Solution S1;
    int res = S1.wiggleMaxLength(test);
    std::cout << res << std::endl;
    return 0;
}

4--最大子序和

主要思路:
贪心地纳入当前数,如果和为负值,就将和置为 0,否则保留;

cpp 复制代码
#include <iostream>
#include <vector>
#include <limits.h>

class Solution {
public:
    int maxSubArray(std::vector<int>& nums) {
        int sum = 0;
        int max_sum = INT_MIN;
        for(int i = 0; i < nums.size(); i++){
            sum = sum + nums[i];
            if(sum > max_sum) max_sum = sum;
            if(sum < 0) sum = 0;
        }
        return max_sum;
    }   
};

int main(int argc, char* argv[]){
    // nums = [-2,1,-3,4,-1,2,1,-5,4]
    std::vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    Solution S1;
    int res = S1.maxSubArray(nums);
    std::cout << res << std::endl;
    return 0;
}

5--买卖股票最佳时机II

相关推荐
hsling松子12 分钟前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui12337 分钟前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝38 分钟前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O1 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King2 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家2 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain2 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-04 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20244 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh6 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝