算法训练营第三十四天||1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

news2024/9/21 22:49:58

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

自己思路:自己想的就是把数组按从小到大排序,然后把前k小的数字都取反,然后相加起来,这个思路没有考虑到前k个小的数字中不全是负数的情况,比如这个数组全大于0的数,这种情况就需要将第一个数反复取反,这样得到的和是最大的。

  • 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和
class Solution {
public:
    // static bool cmp(const int &a,const int &b);
    //     int q = max(0-a,a-0);
    //     int w = max(0-b,b-0);
    //     return q>w;
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        for(int i = 0;i < nums.size();i++){
            if(nums[i]<0&&k>0){
                nums[i] = -nums[i];
                k--;
            }
        }
        sort(nums.begin(),nums.end());
        if(k > 0){
            if(k%2==1){
                nums[0]=-nums[0];
            }
        }
        int sum = 0;
        for(int i = 0;i<nums.size();i++){
            sum += nums[i];
        }
        return sum;
    }
};

134. 加油站

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

如图:

那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?

如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了。

那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图:

如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。

区间和1 + 区间和2 < 0 同时 区间和2>0,只能说明区间和1 < 0, 那么就会从假设的箭头初就开始从新选择其实位置了。

那么局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int gassum = 0;
        int costsum = 0;
        for(int i = 0;i < gas.size();i++){
            gassum+=gas[i];
            costsum+=cost[i];
        }
        if(costsum > gassum) return -1;

        vector<int> index;
        for(int i = 0;i<gas.size();i++){
            index.push_back(gas[i]-cost[i]);
        }
        int cur = 0;
        int start = 0;
        for(int i = 0;i<index.size();i++){
            cur += index[i];
            if(cur<0){
                cur = 0;
                start = i + 1;
            }
        }
        return start;

        
        
    }
};

135. 分发糖果 

 这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼

先确定右边评分大于左边的情况(也就是从前向后遍历)

此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果

局部最优可以推出全局最优。

如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1

代码如下:

// 从前向后
for (int i = 1; i < ratings.size(); i++) {
    if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
}

如图:

再确定左孩子大于右孩子的情况(从后向前遍历)

遍历顺序这里有同学可能会有疑问,为什么不能从前向后遍历呢?

因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果,所以 要从后向前遍历。

如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图:

所以确定左孩子大于右孩子的情况一定要从后向前遍历!

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。

那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

局部最优可以推出全局最优。

所以就取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多

如图:

所以该过程代码如下:

// 从后向前
for (int i = ratings.size() - 2; i >= 0; i--) {
    if (ratings[i] > ratings[i + 1] ) {
        candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
    }
}

整体代码如下:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> res(ratings.size(),1);
        for(int i = 1;i<ratings.size();i++){
            if(ratings[i]>ratings[i-1]){
                res[i] = res[i-1]+1;
            }

        }
        for(int i = ratings.size()-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                res[i] = max(res[i+1]+1,res[i]);
            }
        }

        int result = 0;
        for(int i = 0;i<res.size();i++){
            result+=res[i];
        }
        return result;
    }
};

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

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

相关文章

Redis熟悉到精通:开篇

文章目录 要点使用缓存技术的目的需要缓存机制的数据种类Redis学习资料 要点 掌握数据结构和缓存的基本使用方法; 掌握支撑Redis实现高可靠、高性能的技术; 高可靠 Redis之所以可以实现高可靠、高性能&#xff0c;和它的持久化机制、主从复制机制、哨兵、故障自动恢复、切片集…

模拟对讲机会被数字对讲机取代吗?

经常在网上看到有网友讨论&#xff0c;模拟对讲机是不是快被淘汰了&#xff0c;要被数字对讲机取代了。其实不管是模拟还是数字对讲机&#xff0c;都有其各自的优势&#xff0c;数字对讲要想全面取代模拟对讲&#xff0c;还是有些为时尚早。 传统的模拟对讲机主要是将语音、信…

用Python监控并分析城市空气质量

大家好&#xff0c;同为发展中国家&#xff0c;印度也受到空气质量问题的困扰&#xff0c;本文就以印度的城市为例进行数据分析。使用简单的Python代码&#xff0c;分析城市空气质量及其每天在全国范围内&#xff08;即印度水平&#xff09;的排名。 在开始之前&#xff0c;先介…

(转载)极限学习机(extreme learning machine, ELM)的回归拟合及分类(matlab实现)

单隐含层前馈神经网络(single-hidden layer feedforward neural network,SLFN)以其良好的学习能力在许多领域中得到了广泛的应用。然而&#xff0c;传统的学习算法(如BP算法等)固有的一些缺点&#xff0c;成为制约其发展的主要瓶颈。前馈神经网络大多采用梯度下降方法&#xff…

阿里云服务器安装mysql并用idea连接

文章目录 前言一.购置阿里云服务器——不定时二.在服务器安装mysql——用时5分钟三.打开服务器mysql的端口——用时2分钟1.找到安全组2.打开默认mysql的3306端口 三.打开idea连接数据库——5分钟四.总用时大约20分钟 前言 记录第一次通过idea连接安装在服务器上的数据库——排错…

在vite创建的vue3项目中加载Cesium世界街道地图的底图

在vite创建的vue3项目中加载Cesium世界街道地图的底图 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件 import { defineConfig } from vite import vue from vitej…

ETHERCAT转PROFINET协议网关连接ethercat网线接口定义

大家好&#xff0c;今天我要给大家介绍一款神奇的产品&#xff0c;YC-PN-ECT&#xff0c;它是一款 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET 网络和 ETHERCAT 网络连接起来&#xff0c;让不同厂家的 PLC 能够互相通信&#xff0c;真是太酷了&#xff01; PEO…

T100新增栏位,配置ACC作业并提供开窗作业维护

需求分析:将xxxx作业中的一个界面新增一个栏位,并提供开窗功能进行资料的维护。 一、ACC自适应配置文档开发 1.1 azzi650 注册应用分类码【ACC】 新增一个资料 应用分类码【数字】说明 填写文字说明作业编号:这个时候是空的作业名称:也是空的1.2 azzi910 作业基本维护 这个…

做爬虫如何选择Python和C语言

目录 优劣势分析 Python 进行爬虫的优势&#xff1a; Python 进行爬虫的劣势&#xff1a; C进行爬虫的优势&#xff1a; C进行爬虫的劣势&#xff1a; 示例代码说明 Python 示例代码&#xff1a; C语言 示例代码&#xff1a; 怎么选择 优劣势分析 Python 进行爬虫的优…

Java设计模式之创建型-原型模式(UML类图+案例分析)

一、基础概念 通过复制已有对象作为原型&#xff0c;通过复制该原型来返回一个新对象&#xff0c;而不是新建对象&#xff0c;说白了就是不断复制相同的对象罢了。 二、UML类图 三、角色分析 角色描述抽象原型类规定了具体的原型对象必须实现的clone()方法具体原型类实现抽象…

倒计时1天!LeaTech全球CTO领导力峰会TVP四周年庆典即将开幕

引言 3 月 4 日&#xff0c;上海扬子江丽笙精选酒店&#xff0c;LeaTech 全球 CTO 领导力峰会暨腾讯云 TVP 四周年、CTO 训练营校友联合庆典即将开幕。本次 LeaTech 全球 CTO 领导力峰会以“寻光之旅”为主题&#xff0c;腾讯云 TVP 携手 51CTO&#xff0c;联合邀请业内资深领袖…

C# winform界面显示3D点云图像(halcon+VTK)

前一段时间研究了下halcon里的3d算法&#xff0c;想着把3d图像显示在C#编写的软件界面上&#xff0c;试了下halcon的控件&#xff0c;没成功。后来学习了一点VTK的知识&#xff0c;实现了3d图像的显示&#xff0c;可旋转&#xff0c;平移&#xff0c;缩放观察&#xff0c;当然也…

为什么国内做不出好的3A游戏?

个人觉得原因如下&#xff1a; 主要原因&#xff1a; 市场需求和消费观念&#xff1a;国内游戏市场对游戏类型和风格有着自身的特点和需求。一些热门游戏类型&#xff0c;如多人在线游戏、手机游戏等&#xff0c;相对于传统的3A游戏更受国内玩家欢迎。这可能导致国内游戏公司…

QInputDialog 不显示ok或cancel按钮bug

今天遇到一个奇怪问题&#xff0c;就是调用 QInputDialog::getText去获取输入文本&#xff0c;但是无法显示系统ok和cancel按钮&#xff0c;我记得之前是可以的&#xff0c;于是我回退上一个版本是正常&#xff0c;于是对比两个版本代码&#xff0c;发现&#xff0c;自己重写 Q…

【人工智能】贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…

stm32(定时器和PWM知识点)

一、定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz { unsigned char i, j, k; _nop_(); i 4; j 129; k 119; do { do { while (--k); } while (--j); } while (--i); }定时器工作原理&#xff1a; 使用精准的时基&#xff0c…

面试靠微服务扭转局面,知乎夸爆的微服务学习笔记到底有多牛?

我们现在的服务-微服务 我感觉微服务不是一个架构&#xff0c;而是像一个生态&#xff0c;应用与应用之间互相独立&#xff0c;却又彼此依赖。通过 DDD 的模型来设计一个地图&#xff0c;把合适的代码放到合适的地方去。实现微服务涉及的工具太多&#xff0c;以下我采用spring…

Python -- 多任务、进程、线程

文章目录 多任务的介绍多任务的执行方式 进程进程的概念进程的作用进程的使用多进程获取进程编号 进程执行带有参数的任务介绍args参数和kwargs的使用 进程注意点进程之间不共享全局变量主进程会等待所有子进程执行结束再结束 线程介绍概念 线程的作用多线程的使用线程执行有参…

在OpenCV中进行图像预处理

今天&#xff0c;我们进一步深入&#xff0c;并处理在图像处理中常用的形态学操作。形态学操作用于提取区域、边缘、形状等。 什么是形态学操作&#xff1f; 形态学操作是在二值图像上进行的。二值图像可能包含许多不完美之处。特别是由一些简单的阈值操作产生的二值图像&#…

2023-07-10 cmake管理的项目中使用vcpkg管理第三方库

一、安装 从Github上克隆Vcpkg仓库然后执行安装命令即可&#xff1a; git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat 安装自己需要的第三方库 .\vcpkg\vcpkg install [packages to install] 更多教学可参考&#xff1a; https://learn.microsoft…