数据结构算法系列----贪心算法

news/2024/4/27 22:14:18/文章来源:https://blog.csdn.net/2301_77961281/article/details/136962785

目录

一、什么是贪心

1、定义:

2、举例:

二、例题

完整代码:


一、什么是贪心

1、定义:

      贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。在贪心算法中,通过 局部最优 解来达到全局最优解。贪心算法通常用于解决最优化问题,每一步都采取当前状态下最优的选择,而不考虑之后的结果会如何。

   大家如果有学过数据结构这门课肯定会知道下面这个例子,通过这个例子能更好的理解贪心:

2、举例:

假设题目为:给定一个整数数组,找出数组中连续子数组的最大和。

题目描述: 给定一个整数数组,编写一个程序来找到数组中连续子数组(至少包含一个元素)的最大和,并返回这个最大和。

示例: 输入:[1, 3, 5, -4, 5, 2, 1] 输出:12 解释:连续子数组[1, 3, 5, -4, 5, 2, 1]的最大和为12。

这个问题可以用一个简单的贪心算法来解决。我们可以遍历整个数组,同时维护两个变量:`current_sum`表示当前位置的最大子段和,`max_sum`表示全局最大子段和。

   如果不会贪心,我们很容易想到用暴力的方法解决,双重循环第一层固定子段的头,第二层固定子段的尾。但是这样时间复杂度就为o(n²)了。所以这个时候我们就要引入贪心算法。

具体步骤如下:
1. 初始化`current_sum`和`max_sum`为数组的第一个元素。
2. 从第二个元素开始遍历数组:
   - 更新`current_sum`为当前元素值与`current_sum + 当前元素值`中的较大值。
   - 更新`max_sum`为`max(max_sum, current_sum)`,即全局最大子段和为当前位置的最大子段和和之前的全局最大子段和中的较大值。
3. 遍历完整个数组后,`max_sum`即为最大子段和。

这种方法的时间复杂度为O(n),其中n是数组的长度。

#include <iostream>
#include <vector>using namespace std;int maxSubArray(vector<int>& nums) {int current_sum = nums[0];int max_sum = nums[0];for (int i = 1; i < nums.size(); i++) {current_sum = max(nums[i], current_sum + nums[i]);max_sum = max(max_sum, current_sum);}return max_sum;
}int main() {vector<int> nums = {1, 3, 5, -4, 5, 2, 1};int result = maxSubArray(nums);cout << "Maximum sum of subarray: " << result << endl;return 0;
}

二、例题

【牛客】-道路铺设

https://ac.nowcoder.com/acm/problem/21222

   因为这个题目可以选择区间去减少深度,所以我们很容易想到要得出答案观察连续的区间即可,我们从头开始,如果是一段连续递减序列那么其实这个序列需要减掉的就是最大值,比如说5 3 3 1

先【1,4】减一次,再【1,3】两次,再【1,1】一次,一共就是五次。但是当这个不是一个连续递减序列是比如5 3 3 1 5的手这个区间【1,5】的时候就变为4 2 2 0 4不能一起减了,因为被0隔开了,所以我们要先像上面那样处理完前一个区间,再来处理这个4,所以能得到如果不递减的时候答案要加上这个不递减的值减去前面的值。

完整代码:

#include<bits/stdc++.h>
using namespace std;int main(){int n, ans;cin >> n; // 输入数组长度vector<int> a(n); // 定义大小为n的整数数组cin >> a[0]; // 输入第一个元素ans = a[0]; // 初始化最大子段和为第一个元素// 遍历数组for(int i = 1; i < n; i++){cin >> a[i]; // 输入当前元素if(a[i] >= a[i-1]){ans += a[i] - a[i-1]; // 如果当前元素大于等于前一个元素,将其加入最大子段和} }cout << ans << endl; // 输出最大子段和return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql数据库:事务管理

目录 一、Mysql事务的概述 1、Mysql事务的概念 2、事务的ACID四大特性 3、事务之间的相互影响 4、事务的四种隔离级别 5、MySQL与Oracle自动提交事务的区别 6、事务隔离级别的作用范围 二、Mysql事务相关操作 1、查询和设置事务隔离级别 1.1 全局级事务隔离级别 1.1…

量子计算+运营优化!IonQ 和 德国DESY 合作提升机场登机口调度效率

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨 沛贤 深度好文&#xff1a;1200字丨8分钟阅读 3月14日&#xff0c;量子计算公司IonQ宣布了与德国电子同步加速器&#xff08;DESY&#xff0c;德国的大型粒子物理学研…

【正点原子FreeRTOS学习笔记】————(2)FreeRTOS的任务创建和删除

这里写目录标题 一、任务创建和删除的API函数&#xff08;熟悉&#xff09;二、任务创建和删除&#xff08;动态方法&#xff09;&#xff08;掌握&#xff09;三、任务创建和删除&#xff08;静态方法&#xff09;&#xff08;掌握&#xff09; 一、任务创建和删除的API函数&a…

数据结构:初识树和二叉树

目前主流的方式是左孩子右兄弟表示法 我们的文件系统就是一个树 以上就是树的概念&#xff0c;我们今天还要来学习一种从树演变的重要的结构&#xff1a;二叉树 顾名思义二叉树就是一个结点最多有两个子树。 其中我们还要了解满二叉树和完全二叉树的概念 注意我们的完全二叉…

Java项目:78 springboot学生宿舍管理系统的设计与开发

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员管理公寓…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

盏燕生物科技将出席2024第七届燕窝天然滋补品博览会

参展企业介绍 深圳市盏燕生物科技有限公司&#xff0c;办公室地址位于中国第一个经济特区&#xff0c;鹏城深圳&#xff0c;深圳市龙岗区平湖街道禾花社区富安大道18号亚钢工贸大楼1栋1017A&#xff0c;我公司主要提供一般经营项目是&#xff1a;初级农产品、海产品、化妆品、…

批量添加时,两个选择框为一组,不能选择一模一样的值,将不符合条件的值禁止设为禁止点击

效果展示&#xff1a; 完整代码如下&#xff1a; <template><div class"container"><div v-for"item in arr"><el-select v-model"item.name" placeholder"请选择" change"changeBox"><el-opti…

el-card设置内边距

el-card设置内边距 :deep(.el-card .el-card__body) {padding: 5px; }

Spring中常用的注解及使用规则

文章目录 前言一、Spring注解是什么&#xff1f;二、使用步骤1.注解使用 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 在学习Spring中&#xff0c;我们汇经常用到注解来简化我们的工作&#xff0c;接下来将为大家简单介绍一下常用的注解 提示&a…

如何实现无公网IP及服务器实现公网环境企业微信网页应用开发调试

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

java日志技术——Logback日志框架安装及概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 日志 什么是日志 程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的各种信息&#xff0c;通过日志可以进行操作分析&#xff0c;bug定位等 记录日志的方案 程…

【爬虫基础】第6讲 opener的使用

在爬虫中&#xff0c;opener是一个用来发送HTTP请求的对象。它可以用来模拟浏览器发送请求&#xff0c;包括设置请求头、处理Cookie等操作。使用opener可以实现一些高级功能&#xff0c;如模拟登录、处理验证码等。 方法1&#xff1a; from urllib.request import Request,bu…

【数据结构】顺序表的实现——静态分配

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Linux manim安装

简介 根据文档可知, manim目前分为两个版本, 一个是由3Blue1Brown维护更新的最新版本的manimgl, 另一个是稳定的社区版本manim or manimce. 两个版本在安装和使用上都有些不同, 不要搞混. Linux manim ERROR No package ‘pangocairo’ found Getting requirements to buil…

使用 .NET 和 Teams Toolkit 构建 AI 机器人、扩展 Copilot for Microsoft 365 以及更多

作者&#xff1a;Ayca Bas 排版&#xff1a;Alan Wang Teams Toolkit for Visual Studio 帮助 .NET 开发人员为 Microsoft Teams 构建、调试和发布应用程序。我们很高兴向大家宣布&#xff0c;Teams Toolkit for Visual Studio 2022 17.9 版本为 .NET 开发人员提供了许多令人兴…

【Qt】使用Qt实现Web服务器(六):QtWebApp用户名密码登录

1、示例 1)演示 2)登录 3)显示 2、源码 示例源码Demo1->LoginController void LoginController::service(HttpRequest& request, HttpResponse& response) {

Wagtail-基于Python Django的内容管理系统CMS实现公网访问

目录 前言 1. 安装并运行Wagtail 1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具 3. 实现Wagtail公网访问 4. 固定Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&…

鸿蒙开发实战-如何开发一个字符串加解密应用程序

介绍 本Codelab针对用户隐私安全&#xff0c;使用加密算法API对密码进行加密存储&#xff0c;模拟开发一个用户注册登录应用。实现如下功能&#xff1a; 实现登录、注册、登录成功页面。注册的用户数据保存到关系型数据库。登录时通过查询数据库校验用户是否存在、密码是否正…