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

news2024/11/29 12:51:23

目录

一、什么是贪心

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.coloradmin.cn/o/1556156.html

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

相关文章

(C语言)fgets与fputs函数详解

目录 1. fputs函数详解 1.1 向文件流输入数据 1.2 向标准输出流输出数据 2. fgets函数详解 2. 1 从文件流中得到数据 2.2 从标准输入流读取数据 1. fputs函数详解 头文件&#xff1a;stdio.h 函数有两个参数&#xff1a;str 与 stream 作用&#xff1a;写一串字符串到流…

计算机系统基础 5 物理地址的形成

历史 早期&#xff0c;程序员自己管理主存&#xff0c;通过分解程序并覆盖主存的方式执行程序 取指令和存储操作数所有的地址都是物理地址&#xff1b; 执行速度快&#xff0c;无需进行地址转换&#xff1b; 未采用虚拟存储机制。 1961年有人提出自动执行overlay…

【动手学深度学习-pytorch】9.2长短期记忆网络(LSTM)

长期以来&#xff0c;隐变量模型存在着长期信息保存和短期输入缺失的问题。 解决这一问题的最早方法之一是长短期存储器&#xff08;long short-term memory&#xff0c;LSTM&#xff09; (Hochreiter and Schmidhuber, 1997)。 它有许多与门控循环单元&#xff08; 9.1节&…

【学习笔记】java项目—苍穹外卖day04

文章目录 1. 新增套餐1.1 需求分析和设计1.2 代码实现1.2.1 DishController1.2.2 DishService1.2.3 DishServiceImpl1.2.4 DishMapper1.2.5 DishMapper.xml1.2.6 SetmealController1.2.7 SetmealService1.2.8 SetmealServiceImpl1.2.9 SetmealMapper1.2.10 SetmealMapper.xml1.…

HarborCDN技术分析

一、介绍 简要介绍 ​​Harbor​​ 是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker C…

NC269391 炸鸡块哥哥的粉丝题

题目描述 智乃作为炸鸡块哥哥的粉丝&#xff0c;做了一场炸鸡块哥哥的比赛后得出一个结论&#xff0c;那就是炸鸡块哥哥的话&#xff0c;最多只能信半句。 现在给你一个长度为N的字符串S&#xff0c;请输出前 个字符&#xff0c;表示只能相信半句话。 例如当炸鸡块哥哥说&…

既有理论深度又有技术细节——深度学习计算机视觉

推荐序 我曾经试图找到一本既有理论深度、知识广度&#xff0c;又有技术细节、数学原理的关于深度学习的书籍&#xff0c;供自己学习&#xff0c;也推荐给我的学生学习。虽浏览文献无数&#xff0c;但一直没有心仪的目标。两周前&#xff0c;刘升容女士将她的译作《深度学习计…

python安装删除以及pip的使用

目录 你无法想象新手到底会在什么地方出问题——十二个小时的血泪之言&#xff01; 问题引入 python modify setup 隐藏文件夹 环境变量的配置 彻底删除python 其他零碎发现 管理员终端 删不掉的windous应用商店apps 发现问题 总结 你无法想象新手到底会在什么地方…

(学习日记)2024.03.27:UCOSIII第二十四节:任务状态

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Java毕业设计 基于SSM新闻管理系统

Java毕业设计 基于SSM新闻管理系统 SSM jsp 新闻管理系统 功能介绍 用户&#xff1a;首页 图片轮播 查询 登录 注册 新闻正文 评论 广告 社会新闻 天下新闻 娱乐新闻 个人中心 个人收藏 管理员&#xff1a;登录 用户管理 新闻管理 新闻类型管理 角色&#xff1a;用户 管理员…

笔记本电脑上部署LLaMA-2中文模型

尝试在macbook上部署LLaMA-2的中文模型的详细过程。 &#xff08;1&#xff09;环境准备 MacBook Pro(M2 Max/32G); VMware Fusion Player 版本 13.5.1 (23298085); Ubuntu 22.04.2 LTS; 给linux虚拟机分配8*core CPU 16G RAM。 我这里用的是16bit的量化模型&#xff0c;…

python实战之进阶篇(一)

定义类 1. 构造方法 2. 实例方法 3. 类方法 类似于Java中的静态方法, 使用方式: 类名.类方法 4. 私有变量 5. 私有方法 6. 使用属性set和get

stm32再实现感应开关盖垃圾桶

一、项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖 发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖 按下按键时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖 硬件清单 SG90 舵机&#xff0c;…

MySQL生产环境常见故障及解决方案汇总

MySQL生产环境常见故障及解决方案汇总 1. MySQL主从同步异常故障1.1. 情景说明1.2. 排查过程1.3. 数据同步2. MySQL慢查询故障1. MySQL主从同步异常故障 1.1. 情景说明 MySQL主库网卡需要更换IP地址,并将原IP地址配置为MySQL集群的VIP地址,上层应用程序其实不需要更改连接My…

牛客练习赛123 A~C

A.炸鸡块哥哥的粉丝题 输出字符串的前 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil ⌈2n​⌉ 个字符 void solve() {int n;string s;cin >> n >> s;cout << s.substr(0, (n 1) / 2); }B.智乃想考一道鸽巢原理 当小球总个数为奇数时&#xff0c;贪心的留下 1 个…

(C++笔试题)选择题+编程题

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 选择题 第一道 下面对析构函数的正确描述是&#xff08;&#xff09; A. 系统不能提供默认的析构函数B. 析构函数必须由用户定义C. 析构函数没有参数D. 析构函数可以设置默认参数 解析&#xff1a; 正确描述析构函数的…

【独立开发前线】Vol.27 为什么独立开发者需要一个网站?

现在很多内容创造者都把主要平台放在了第三方平台上&#xff0c;包括像知乎、B站、头条等等&#xff0c;但即使在2024年&#xff0c;我依然建议你做一个完全属于你的网站。 为什么呢&#xff1f; 你有没有在微信或知乎看到过这种拦截页面&#xff1f; 你花了好大的精力写了一…

关于github提交失败的问题

问题描述 Username for https://github.com: LAL-Better Password for https://LAL-Bettergithub.com: remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/get-started/getting-started-with-git/abo…

线程的通信

1.需求(为什么需要线程通信) 当我们需要多个线程完成同一任务时&#xff0c;并且希望他们有规律的执行&#xff0c;那么多线程之间需要一些通信机制&#xff0c;并且可以协调他们的工作&#xff0c;以此实现多个线程共同操作共享数据. 例 : A做包子&#xff0c;B吃包子&#…

SAP Fiori开发中的JavaScript基础知识9 - 代码注释,严格模式,JSON

1 背景 本文将介绍JavaScript编程中的三个小知识点&#xff1a;也即代码注释&#xff0c;严格模式&#xff0c;JSON文件。 2 代码注释 JavaScript的代码注释方式如下&#xff1a; // Single line comment/* Multi line comment */3 严格模式 JavaScript的"strict mod…