贪心算法合集一

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

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。) 

以这种方式修改数组后,返回数组可能的最大和(返回的是数组可能的最大和,可以排序)

答案用了两次贪心

我感觉只要在翻转K次,每次翻转最小的就行

1.是正数:翻转最小的整数

2.是负数:翻转最大的负数

134. 加油站

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

局部最优

局部最优在这里指的是:当我们从某个加油站i出发,沿着环路行驶,如果在到达某个加油站jj > i)之前,油箱中的油量(即curSum)变为负数,那么我们就知道从加油站i到加油站j(不包括j)之间的任何加油站都不能作为起始点。因为从任何这些加油站出发,我们都会在到达加油站j之前耗尽汽油。

推导全局最优

全局最优是找到一个起始加油站,使得从该加油站出发可以绕环路行驶一周而不耗尽汽油。我们如何通过局部最优来推导全局最优呢?

  1. 初始假设:我们从第一个加油站(编号为0)开始行驶。
  2. 计算curSum:在行驶过程中,我们不断累加每个加油站的剩余油量rest[i]curSum中。
  3. 检查curSum:如果curSum在某个点i变为负数,我们知道从0到i之间的任何加油站都不能作为起始点。
  4. 更新起始点:我们将起始点更新为i+1,并重置curSum为0。
  5. 继续行驶:从新的起始点开始,我们继续行驶并重复步骤2-4,直到我们遍历完所有的加油站。

在这个过程中,我们始终在寻找一个起始点,使得从这个点出发行驶到任何一个加油站时,curSum都保持非负。由于我们总是从curSum变为负数的下一个加油站开始重新计算,我们可以确保找到的是这样一个起始点:从这个点出发,curSum在整个环路中都是非负的,从而实现了全局最优。

贪心的体现

  1. 选择当前最优:在每一步中,我们都选择了一个局部最优解——即当前剩余油量最多的加油站作为下一步的起点。
  2. 无后效性:一旦我们选择了某个加油站作为起点,并决定行驶到下一个加油站,这个决定就不会影响我们未来在环路上的行驶。换句话说,我们的决策只取决于当前的状态,而不取决于之前的状态或未来的决策。
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;int totalSum = 0;int start = 0;for (int i = 0; i < gas.size(); i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0start = i + 1;  // 起始位置更新为i+1curSum = 0;     // curSum从0开始}}if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了return start;}
};

135. 分发糖果

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

你需要按照以下要求,帮助老师给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻的孩子中,评分高的孩子必须获得更多的糖果。

那么这样下来,老师至少需要准备多少颗糖果呢?

对于这道题目,我们需要保证每个孩子获得的糖果数至少比其相邻的孩子(如果存在的话)多一个,如果其评分更高。这可以通过两次遍历实现:

  1. 从左到右遍历:对于每个孩子,如果其评分高于前一个孩子,则给予其比前一个孩子多一个的糖果数。
  2. 从右到左遍历:对于每个孩子,如果其评分高于后一个孩子,并且按从左到右遍历的规则给的糖果数小于其后一个孩子加一个的糖果数,则更新其糖果数为后一个孩子加一个的糖果数。
class Solution {
public:int candy(vector<int>& ratings) {int n = ratings.size();vector<int> left(n,1);       // 初始化分配空间for (int i = 0; i < n; i++){if(i > 0 && ratings[i] > ratings[i - 1]){left[i] = left[i - 1] + 1;} else {left[i] = 1;}}// 打印左边遍历的结果  for (int i = 0; i < n; i++) {  std::cout << "Left[" << i << "]: " << left[i] << std::endl;  }int totalnum = 0;vector<int> right(n, 1);for(int i = n - 1; i >= 0; i--){if(i < n-1 && ratings[i] > ratings[i+1]){right[i]=right[i+1]+1;} else{right[i] = 1;}totalnum += max(left[i], right[i]);}// 打印右边遍历的结果  for (int i = 0; i < n; i++) {  std::cout << "Right[" << i << "]: " << right[i] << std::endl;  } return totalnum;}
};

406.根据身高重建队列

局部最优

在这个问题中,局部最优可以理解为:在当前考虑的范围内(即按照身高排序后的队列中),我们总是优先处理身高较高的个体,并根据其k值(即前面有k个身高不低于其的人)来将其放置在正确的位置上。这样做的目的是为了保持身高的有序性(从高到低),并且尽量满足每个人的k值要求。

全局最优

全局最优则是指:整个队列最终满足所有人的身高和位置要求,即对于队列中的任意一个人[h, k],其前面恰好有k个身高不低于h的人

  1. 身高排序:首先按照身高从高到低排序,确保了后面插入的人(身高较矮)不会影响到前面已经插入的人(身高较高)的相对位置,从而满足了身高的全局有序性。

  2. k值的利用:在身高排序的基础上,根据每个人的k值将其插入到队列中的正确位置。后插入的人不会影响到前面已经插入的人的位置,从而保证了k值的正确性。

    class Solution {
    private:  // Helper function to print the queue in a readable format  void printQueue(const vector<vector<int>>& que) {  for (const auto& person : que) {  cout << "[" << person[0] << ", " << person[1] << "] ";  }  cout << endl;  }  
    public:static bool cmp(const vector<int>&a,const vector<int>&b){if(a[0]==b[0]) return a[1]<b[1];return a[0]>b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);vector<vector<int>> que;for (int i = 0; i < people.size(); i++) {  int position = people[i][1];  cout << "Inserting person [" << people[i][0] << ", " << people[i][1] << "] at position " << position << ":" << endl;  cout << "Before insertion: ";  printQueue(que);  que.insert(que.begin() + position, people[i]);  cout << "After insertion: ";  printQueue(que);  cout << endl;  }return que;  }
    };  
    标准输出
    Inserting person [6, 0] at position 0:
    Before insertion: 
    After insertion: [6, 0] Inserting person [5, 0] at position 0:
    Before insertion: [6, 0] 
    After insertion: [5, 0] [6, 0] Inserting person [4, 0] at position 0:
    Before insertion: [5, 0] [6, 0] 
    After insertion: [4, 0] [5, 0] [6, 0] Inserting person [3, 2] at position 2:
    Before insertion: [4, 0] [5, 0] [6, 0] 
    After insertion: [4, 0] [5, 0] [3, 2] [6, 0] Inserting person [2, 2] at position 2:
    Before insertion: [4, 0] [5, 0] [3, 2] [6, 0] 
    After insertion: [4, 0] [5, 0] [2, 2] [3, 2] [6, 0] Inserting person [1, 4] at position 4:
    Before insertion: [4, 0] [5, 0] [2, 2] [3, 2] [6, 0] 
    After insertion: [4, 0] [5, 0] [2, 2] [3, 2] [1, 4] [6, 0] 

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

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

相关文章

如何理解数据模型?颗粒度、维度及指标?

问题1 什么是数据模型&#xff1f; 数据模型反映在数据库中就是一张表&#xff0c;该表把他分开来看有以下关注的点。 &#xff08;1&#xff09;主键&#xff1a;表明该表主要的分析对象&#xff0c;比如我们的分析对象是订单、是商品、是门店&#xff0c;那么主键就是订单id,…

Qt 线程 QThread类详解

Qt 线程中QThread的使用 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个…

你所不知道的关于AI的27个冷知识——算法的作用

算法的作用 亲爱的朋友们,今天我们要探讨的是一个关于“魔法配方”的故事,也就是AI世界里的算法。这些算法就像是古老的魔法咒语,让AI能够在我们生活中的各个角落施展奇迹。让我们一起来揭开这些神奇算法的面纱,看看它们是如何在幕后默默工作的。 什么是算法? 首先,让…

昇思MindSpore学习笔记6-02计算机视觉--ResNet50迁移学习

摘要&#xff1a; 记录MindSpore AI框架使用ResNet50迁移学习方法对ImageNet狼狗图片分类的过程、步骤。包括环境准备、下载数据集、数据集加载、构建模型、固定特征训练、训练评估和模型预测等。 一、概念 迁移学习的方法 在大数据集上训练得到预训练模型 初始化网络权重参数…

【机器学习】特征选择:精炼数据,提升模型效能

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 特征选择&#xff1a;精炼数据&#xff0c;提升模型效能引言为何进行特征选择&a…

Android面试题汇总-框架技术

一、OkHttp OkHttp是一个流行的HTTP客户端库&#xff0c;用于发送和接收HTTP网络请求。以下是OkHttp的关键特性和工作原理的概述&#xff1a; 执行请求: execute() 方法: 同步执行HTTP请求&#xff0c;返回Response对象。enqueue() 方法: 异步执行HTTP请求&#xff0c;通过Ca…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…

云原生存储:使用MinIO与Spring整合

在现代云原生应用开发中&#xff0c;高效、可靠的存储解决方案是至关重要的。MinIO是一个高性能、分布式的对象存储系统&#xff0c;它与Amazon S3兼容&#xff0c;非常适合在Kubernetes等云原生环境中使用。本文将详细介绍如何在Spring Boot应用中整合MinIO&#xff0c;并提供…

接口调用的三种方式

例子&#xff1a; curl --location http://110.0.0.1:1024 \ --header Content-Type: application/json \ --data {"task_id": 1 }方式一&#xff1a;postman可视化图形调用 方式二&#xff1a;Vscode中powershell发送请求 #powershell (psh) Invoke-WebRequest -U…

熟悉Realsense和机械臂的控制库(如MoveIt!)的使用,以及基本的PID控制和其他控制算法

项目1&#xff1a;基础Realsense数据采集与处理 目标&#xff1a;了解Realsense摄像头的基本使用&#xff0c;数据采集和处理。 步骤&#xff1a; 安装并配置Realsense SDK。使用Realsense摄像头采集深度图像和RGB图像。实现基本的图像处理操作&#xff0c;如边缘检测、物体识…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

超图Environment.initialization报空指针

如果库没倒错&#xff0c;许可证也在&#xff0c;一般是权限问题&#xff0c;要确保以下三个读写权限都在&#xff0c;制定版本要动态申请&#xff0c;官方Demo的代码里动态申请权限少一个。 /*** 需要申请的权限数组*/protected String[] needPermissions {Manifest.permiss…

Linux - VIM 全面教程

Linux - VIM 全面教程 前言 VIM 是一个强大的文本编辑器&#xff0c;被广泛用于 Linux 系统上。对于许多程序员和系统管理员来说&#xff0c;熟练掌握 VIM 是一项非常重要的技能。本教程将全面介绍 VIM 的基础知识和高级功能&#xff0c;帮助你更好地利用这一工具。 目录 安…

elasticsearch集群模式部署

系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) es版本&#xff1a; elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 添加之前用户要是创建好了的(这里的es用户并不是绝对要求&#xff0c;你可以根据具体的需要命名创建) visudo 修改配置文件 sys…

【吊打面试官系列-MyBatis面试题】使用 MyBatis 的 mapper 接口调用时有哪些要求?

大家好&#xff0c;我是锋哥。今天分享关于 【使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f; 1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的…

数据结构(初阶1)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

Sharding-JDBC分库分表之SpringBoot分片策略

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 前言 前一篇以一个示例分享了Sharding-JDBC的基本使用。在进行分库分表时&#xff0c;可以设置分库分表的分片策略&#xff0c;在示例中&#xff0c;使用的是最简单的…

面对数据不一致性的解决方案:

polarDB是读写分离和计算存储分离的分布式数据库&#xff0c;并且副本的log replicate是基于Parallel-Raft协议来实现的。所以在瞬时进行写和读的操作时&#xff0c;是不可避免会存在数据一致性问题&#xff0c;导致这个数据一致性问题的原因不是事务&#xff0c;而是多副本日志…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

数据结构--二叉树收尾

1.二叉树销毁 运用递归方法 分类&#xff1a; 根节点左子树右子树&#xff08;一般都是这个思路&#xff0c;不断进行递归即可&#xff09; 选择方法&#xff08;分析)&#xff1a; 前序&#xff1a;如果直接销毁根就无法找到左子树右子树 中序&#xff1a;也会导致丢失其…