算法——贪心

news2025/1/10 2:41:58

「贪心的本质是选择每一阶段的局部最优,从而达到全局最优」

贪心无套路

1. 分发饼干

贪心策略:

(1)局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

(2)局部最优就是小饼干喂给胃口小的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

代码实现:

// 冒泡排序
void sort(int *a, int len) {
    int flag = 1;
    for (int i = len - 1; flag && i > 0; i--) {
        flag = 0;
        for (int j = 0; j < i; j++) {
            if (a[j] > a[j + 1]) {
                flag = 1;
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp; 
            }
        }
    }
}

int findContentChildren(int *g, int gSize, int *s, int sSize) {
    sort(g, gSize);
    sort(s, sSize);
    int j = 0;
    int sum = 0;
    for (int i = 0; i < gSize; i++) {
        while (j < sSize && s[j] < g[i]) {
            j++;
        }
        if (j < sSize) {
            sum++;
            j++;
        }
    }
    return sum;
}

2. 摆动序列

贪心策略:

「局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值」

「整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列」

「实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)」

代码实现:

int wiggleMaxLength(int *nums, int numsSize) {
    if (numsSize <= 1) {
        return numsSize;
    }
    int now = 0; // 当前一对峰值
    int pre = 0; // 前一对峰值
    int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
    for (int i = 1; i < numsSize; i++) {
        now = nums[i] - nums[i - 1];
        // 出现峰值
        if ((now > 0 && pre <= 0) || (pre >= 0 && now < 0)) {
            result++;
            pre = now;
        }
    }
    return result;
}

3. 最大子数组和

暴力解法:超时

int maxSubArray(int *nums, int numsSize) {
    int result = INT32_MIN;
    int count = 0;
    for (int i = 0; i < numsSize; i++) { // 设置起始位置
        count = 0;
        for (int j = i; j < numsSize; j++) { // 每次从起始位置i开始遍历寻找最大值
            count += nums[j];
            result = count > result ? count : result;
        }
    }
    return result;
}

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

dp[i]:以 i 结尾的最大连续子序列和为dp[i]

  • 确定递推公式(容斥原理)

dp[i]只有两个方向可以推出来:

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和

  • nums[i],即:从头开始计算当前连续子序列和

一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

#define max(a, b) ((a) > (b) ? (a) : (b))

int maxSubArray(int *nums, int numsSize) {
    if (numsSize == 0) { // 特殊情况
        return 0;
    }
    int dp[numsSize];
    dp[0] = nums[0];
    int result = dp[0];
    for (int i = 1; i < numsSize; i++) {
        dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移方程
        result = max(result, dp[i]); // result 保存dp[i]的最大值
    }
    return result;
}

贪心策略:

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小

全局最优:选取最大“连续和”

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

4. 买卖股票的最佳时机||

贪心策略:

「局部最优:收集每天的正利润,全局最优:求得最大利润」

5. 跳跃游戏

贪心策略:

「贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点」

6. 跳跃游戏||

7. K次取反后最大化的数组和

贪心策略:

        局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大

        如果将负数都转变为正数了,K依然大于0

        局部最优:只找数值最小的正整数进行反转,当前数值可以达到最大,全局最优:整个 数组和 达到最大

  • 第一步:将数组按照绝对值大小从大到小排序,「注意要按照绝对值的大小」

  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--

  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完

  • 第四步:求和

8. 加油站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidStudio 由dolphin升级到giraffe,出现“gradle project sync failed“

1 现象描述 将AS由之前的dolphin版本升级到giraffe之后&#xff0c;接着打开以前的Android project&#xff0c;出现了"Gradle project sync failed…"的异常提示&#xff0c;在build面板中并没有出现project sync过程中报错的日志。 异常提示如下图所示&#xff1a…

mysql驱动的下载和JDBC的使用(在idea上)

1.mysql驱动的下载 在这里我们需要进入中央仓库中去下载mysql驱动的下载。 https://mvnrepository.com/ 上面就是中央仓库的网址。 如图&#xff1a; 上面就是中央仓库的网址首页。 1.在上面搜索框内输入mysql 如图&#xff1a; 这里呢&#xff0c;上面的mysql 是8.0以上版…

安装使用sqlite

在SQLite 下载页面中下载Windows的预编译的二进制文件 下载sqlite-tools-win32-*.zip和sqlite-dll-win32-*.zip压缩文件 解压下载的两个压缩文件&#xff0c;创建一个sqlite文件夹&#xff0c;把解压的文件放到sqlite的文件夹中&#xff0c;把创建的sqlite文件夹添加到环境变量…

Python——pgzero游戏打包exe执行时报错

Python——pgzero游戏打包exe执行时报错 记录一次使用 pgzero 开发游戏&#xff0c;使用 pyinstaller 打包时报错 目录结构&#xff1a; 1. 第一次报错 打包指令&#xff1a; pyinstaller -Fw .\code.py结果打开报错 报错如下&#xff1a; Traceback (most recent call…

【2024第一期CANN训练营】2、AscendCL概述

文章目录 【2024第一期CANN训练营】2、AscendCL概述1. AscendCL架构及基本概念1.1 什么是AscendCL&#xff1f;1.2 AscendCL的优势1.3 AscendCL应用场景1.4 基本概念 2. AscendCL接口调用流程2.1 流程概述2.2 详细步骤2.3 头文件和库文件 3. 准备开发和运行环境3.1 部署环境3.2…

基于springboot+vue的乡政府管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;智慧城市作为现代城市发展的新模式&#xff0c;正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为城市的规划、管理、服务等方面带来了革命性的变革。本文…

企业计算机服务器中了devicdata勒索病毒怎么办,devicdata勒索病毒解密工具流程

随着科学技术的不断发展与应用&#xff0c;越来越多的企业开始利用网络开展各项工作业务&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;大大提高了生产运营效率&#xff0c;同时也为企业的发展规划带来不错的契机。但网络是一把双刃剑&#xff0c;网络在为人们提…

算法:一些DFS的经验

DFS:可以看作是向下遍历树的模拟 剪枝&#xff1a;减少时间复杂度 一个dfs所需要具备的元素&#xff1a; 一&#xff0c;出口 1.出口&#xff1a;每一个进入的dfs的出口&#xff0c;可以是枚举全部元素后退出该dfs,也可以是大于层数或剪枝条件........ 二&#xff0c;向下搜…

解决 Nginx 1.24 版本下载视频慢和文件问题的方法

解决 Nginx 1.24 版本下载视频慢和文件问题的方法 如果你最近在腾讯云服务器上遇到了下载视频慢以及视频文件无法正常使用的问题&#xff0c;可能需要检查一下你的 Nginx 版本。下面是一个真实案例的分析和解决方案&#xff0c;希望能帮助你避免或解决类似问题。 背景 一个运…

Vue3 - 笔记

1.创建Vue3项目 1.1vue-cli 使用vue-cli创建Vue3项目&#xff0c;需要确保vue-cli版本在4.5.0以上 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version vue -V## 安装或者升级vue/cli npm install -g vue/cli使用vue-cli创建Vue3项目 vue create vue3…

Input/Output模型

I/O在计算机里指的是INPUT/OUTPUT&#xff0c;也就是输入/输出。IOPS即每秒钟的输入输出量。I/O的工作机制就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。 Linux的I/O 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁盘上的某个资源&#xff…

论文阅读_时序模型_iTransformer

1 2 3 4 5 6 7 8英文名称: ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING 中文名称: ITRANSFORMER&#xff1a;倒置Transformers在时间序列预测中的有效性 链接: https://openreview.net/forum?idX6ZmOsTYVs 代码: https://github.com/thum…

深度学习 精选笔记(13.2)深度卷积神经网络-AlexNet模型

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

7.搜索——1.广度优先搜索BFS(求最优解)

广度优先遍历实现思路 构建辅助队列实现先进先出构建访问集&#xff0c;给已经访问的结点进行标记将起始结点加入队列当队列非空时&#xff1a; 取出队首元素将队首元素的所有邻居入队访问队首元素 队列空即访问完毕 用途&#xff1a;求最优解 例题——catch that cow 代码 …

【LabVIEW FPGA入门】流水线

LabVIEW中流水线 在当今多核处理器和多线程应用程序的世界中&#xff0c;程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化&#xff0c;但 NI LabVIEW 等图形开发环境越来越多地允许工程师和…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流&#xff0c;web3 运动已经开始彻底改变互联网&#xff0c;改写从游戏到金融再到艺术的行业规则。现在&#xff0c;MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者&#xff0c;注册于新加坡&a…

6_20240304开窗

目录 课堂 SQL执行顺序&#xff1a; 开窗函数 累加order by 开窗格式&#xff1a; 排名 三种排名&#xff1a; 偏移 上偏移 下偏移 同环比 加子查询的几种方式 1 放在 select 后面 2 放在 from 后面 当表 ​3 放在where 后 4 放在HAVING 后面 作业 1.Ord…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …