代码随想录算法训练营day33

题目:1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

参考链接:代码随想录

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

思路:本题还是直觉,想使得整体的数组和最大,需要每一次取反都尽可能使的全局最优。先将数组排序,然后如果有负数,优先总左边开始,将最小的负数逐渐往上取反,这样可以使得和尽可能增大。当取到没有负数后,如果是0则直接返回目前结果。如果没有0,则后面就不断重复第一个最小正数即可。时间复杂度O(nlogn)。在具体代码实现上可以简洁一些。

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int sum=0;for(int i=0;i<nums.size();i++){//先求和sum+=nums[i];}for(int i=0;i<k;i++){if(nums[i]<0){if(i==nums.size()-1){//还有一种情况,那就是已经到达最后一个负数,而且后面没有0和正数//这时只需要考虑反转目前这个绝对值最小的负数k-i次而且需要breakif((k-i)%2==1){//反转次数为奇数sum-=(2*nums[i]);}break;}sum-=(2*nums[i]);//普遍情况,直接反转负数}else if(nums[i]==0){break;//如果已经到等于0的情况说明后面怎么变都是这个sum了}else{//正数,后面的所有都是在第一个最小正数循环int minNum=nums[i];if(i>0&&nums[i-1]<0&&(-nums[i-1])<nums[i]){//不是第一个正数,前面一个为负数,这时的反转对象为他们的最小绝对值minNum=-nums[i-1];}if((k-i)%2==1){//(k-i)为剩下还要反转的次数,如果是奇数则需要反转,如果是偶数则直接不变sum-=(2*minNum);}break;}}return sum;}
};

然而我在具体代码实现的时候发现了很多小问题,并不是右手就行,需要对当前值为负数、0、正数分开讨论。其中0最容易;负数还需要考虑是不是数组最后一个数(数组全负),然后计算最后一个元素的剩余反转次数;而正数还需要比较最小正数和最大负数的绝对值,然后再根据剩余反转次数反转。
看完标答,发现如果在开始排序的时候按照绝对值大小排,就可以直接修改原数组,然后最后的反转也十分容易。标答是先全部反转完毕后,再一次计算和。然后对k也是使用递减,以后所有涉及到次数我们都可以用递减的方法,这样不用新定义变量
标答:

class Solution {
static bool cmp(int a, int b) {return abs(a) > abs(b);
}
public:int largestSumAfterKNegations(vector<int>& A, int K) {sort(A.begin(), A.end(), cmp);       // 第一步for (int i = 0; i < A.size(); i++) { // 第二步if (A[i] < 0 && K > 0) {A[i] *= -1;K--;}}if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步int result = 0;for (int a : A) result += a;        // 第四步return result;}
};

实际运行出来还不如我们写的,不知道为什么。

134. 加油站

思路:本题一开始想到的肯定是暴力方法,即遍历一圈的情况,时间复杂度O(n^2)。这里要注意实现细节,但是通不过,超时。这里重点理解rest==0的时候答案不唯一,如果rest等于0,说明有一段走不走都无所谓,因此可以从这一段的开头或者结尾走,都能走到,答案必定不唯一。不过本题设计测试用例的时候就只存在返回-1或者答案唯一的情况,不存在答案不唯一的情况,比如[1,1,1,1,1],[1,1,1,1,1]。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for(int i=0;i<gas.size();i++){int rest=gas[i]-cost[i];//剩余油量int next=(i+1)%gas.size();while(rest>0&&next!=i){//还有油,而且没回来,rest如果等于0则答案不唯一rest=rest+gas[next]-cost[next];next=(next+1)%gas.size();}if(rest>=0&&next==i){//回来了return i;}}return -1;}
};

然后是贪心算法,这个实在想不到,直接看解答。首先是全局贪心方法,如果gas总和小于cost总和,一定跑不了一圈。计算rest[i],从0开始累加,如果没有出现负数,则0就是起点。如果累加最小值为负数,则从非0节点出发,从后向前,看哪个节点可以把负数填满,即为出发点。时间复杂度O(n)。(说实话这个方法我还是没搞太懂)

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;int min = INT_MAX; // 从起点出发,油箱里的油量最小值for (int i = 0; i < gas.size(); i++) {//从0开始累加,先初始计算一下restint rest = gas[i] - cost[i];curSum += rest;if (curSum < min) {min = curSum;}}//算完后curSum为从0开始走完一圈后的油箱余量if (curSum < 0) return -1;  // 情况1,gas总和小于cost总和if (min >= 0) return 0;     // 情况2,如果最小油箱剩余最小值非负,则说明从0开始可以一圈走完,直接返回0// 情况3for (int i = gas.size() - 1; i > 0; i--) {//min小于0,从0走不到,开始考虑其他值int rest = gas[i] - cost[i];min += rest;if (min >= 0) {return i;}}return -1;}
};

详细分析一下,本解法的关键就是将油箱剩余最小值min记录,在从0走完一圈后,这个值就固定下来了,不会再变化了。但是这只是从0开始走的情况,如果从其他地方开始走,这个min的走一圈的变化幅度是固定不变的。当从0走一圈无法完成的时候,我们出发位置往前移动一格,这样就可以加上它的rest,从而判断能否走到。我们从n-1~1再反过来考虑,首先对n-1,min加上rest[n-1],如果此时非负,则说明如果从n-1出发,走一圈的min不会有负数,故4能够完成,如果不行则继续往前考虑3,累加min,一直考虑到1结束(0最开始已经考虑过)。这个解法没有找出局部最优,因此不能完全认为是一种贪心算法,这也就是我们说贪心算法很多没有思路的原因。
看解析还有贪心方法二:即rest和累加走一圈,小于0则不行,在累加到i的过程中,一旦遇到小于0,则说明前面的都不能作为开始,只能从i+1开始,即始终确保局部最优。这里有一个问题,那就是0~i有没有可能出现满足条件的起始?实际是不能的,因为在这个起始点前面的累加和必定小于0,则这时候直接从i+1开始考虑了,也不会漏掉情况。同时还要计算rest总和,总和必须非负,只要总和非负,而从start开始走到n-1也能保证中间没有油量为负的情况,则说明start必定满足,因为再往后走一圈的总和也非负了。时间复杂度O(n)。
在这里插入图片描述
代码如下:

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum=0;int start=0;int totalSum=0;for (int i = 0; i < gas.size(); i++) {//从0开始累加,先初始计算一下restint rest = gas[i] - cost[i];totalSum+=rest;curSum+=rest;if(curSum<0){start=i+1;curSum=0;}}if(totalSum<0) return -1;return start;}
};

135. 分发糖果

思路:本题过于困难,想不到思路,直接看解答。本题关键是要对左边和右边分开考虑,先考虑右边分数大于左边的情况,首先所有孩子分一个,然后只要右边比左边分高,那么就给右边加一个,这时从左往右遍历;然后再考虑左边比右边分高的情况,这时取原本值和右边值加一的最大值,这时从右往左遍历。因为第一遍遍历的时候全是1,故右大于左直接加一就OK,而第二遍遍历的时候,candys数组已经发生了变化,可能原本左边就满足比右边大,这时就不能直接右加一,而是要先比较是不是本来就满足。时间复杂度O(n)。

class Solution {
public:int candy(vector<int>& ratings) {int n=ratings.size();int ans=0;vector<int> candys(n,1);//初始化糖果数组,每个孩子发一个for(int i=1;i<n;i++){if(ratings[i]>ratings[i-1]){candys[i]=candys[i-1]+1;}}for(int i=n-2;i>=0;i--){if(ratings[i]>ratings[i+1]){if(candys[i]<=candys[i+1]){candys[i]=candys[i+1]+1;}}}for(int i=0;i<n;i++){ans+=candys[i];}return ans;}
};

我写出的答案和标答略有区别,主要从右往左遍历的时候多用了个if,而没有用max,实际是一样的。

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

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

相关文章

与汇智知了堂共舞,HW行动开启你的网络安全新篇章!

**网安圈内一年一度的HW行动来啦&#xff01; ** 招募对象 不限&#xff0c;有HW项目经验 或持有NISP二级、CISP证书优先 HW时间 以官方正式通知为准 工作地点&#xff1a;全国 薪资待遇 带薪HW &#xff08;根据考核成绩500-4000元/天不等&#xff09; 招募流程 1.填写报名…

供应链领域主题:生产制造关键术语和系统

BOM&#xff08;Bill of Material&#xff09;物料清单 BOM&#xff08;Bill of Material&#xff09;物料清单&#xff0c;是计算机可以识别的产品结构数据文件&#xff0c;也是ERP的主导文件。BOM使系统识别产品结构&#xff0c;也是联系与沟通企业各项业务的纽带。ERP系统中…

国内通稿在海外新闻媒体如何宣发-大舍传媒

引言 在全球化的时代背景下&#xff0c;海外通稿成为了新闻媒体间交流和宣发的重要方式之一。本文将探讨海外通稿在新闻媒体中的宣发方式&#xff0c;并分析大舍传媒在这方面的成功经验。 来百度APP畅享高清图片 海外通稿的重要性 海外通稿是指由海外记者或通讯社撰写的报道…

JavaScript - 你知道数组去重都有哪些实现方案吗

难度级别:初级及以上 提问概率:70% 数组去重是一道非常经典而又高频的面试题,这里我们提出6种解决方案: 目录 1 第一种 2 第二种 3 第三种 4 第四种

Codigger Desktop:用户体验与获得收益双赢的革新之作(一)

上周&#xff0c;我们介绍了Codigger Desktop凭借其强大的功能、稳定的性能以及人性化的设计&#xff0c;成为了广大开发者的得力助手。Codigger Desktop除了是开发者的利器外&#xff0c;它以其出色的用户体验和创新的收益模式&#xff0c;为用户提供了一个全新的选择。Codigg…

基于LNMP环境上线QQ农场

目录 一.介绍 二. 环境准备 三.安装Mysql数据库 四.安装PHP 五.安装Nginx 六.测试Nginx服务于PHP服务是否能关联 七.项目上线 QQ农场源码&#xff1a;做本项目默认操作者有一定的基础知识与理解能力 链接&#xff1a;https://pan.baidu.com/s/1HF8GZ-yvNh7RbJ61nXOW-g?…

【Django开发】0到1美多商城项目md教程第6篇:账号登录,1. 用户名登录逻辑分析【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

【漏洞复现】泰博云平台 solr SSRF漏洞

0x01 产品简介 泰博云平台,就是指以电商集群的方式,通过供应链有效连接组成“商务云”生态系统,在产品、服务、营销推广等方面实现资源共享,“物”就是线下实体店网络,以众包模式,将行业制造商、分销商、零售商,和提供本土化设计、物流、安装的优质服务商,纳入统一的云…

Java 异常处理

什么是异常&#xff1f; 程序运行时&#xff0c;发生的不被期望的事件&#xff0c;它阻止了程序按照程序员的预期正常执行&#xff0c;这就是异常。异常发生时&#xff0c;是任程序自生自灭&#xff0c;立刻退出终止&#xff0c;还是输出错误给用户&#xff1f;或者用C语言风格…

lego-loam代码解析(2)-自用

学习文章&#xff1a; [1]LeGO-LOAM分析之建图&#xff08;三&#xff09; [2] LeGo-LOAM 源码解析-WinFrom控件库 [3] LeGO-LOAM批注版 [4]LeGO-LOAM 源码阅读笔记&#xff08;mapOptmization.cpp&#xff09; 整合拼起来的&#xff0c;自用 关于transformFusion.cpp 融合粗、…

程序汪10万接的多平台视频分发项目,模拟人工发视频

本项目来自程序汪背后的私活小团队&#xff0c;开发了一个多平台分发视频项目&#xff0c;给粉丝分享一下解决方案和具体项目分开情况付款情况等等细节&#xff0c;希望给想接私活的朋友一些经验参考 程序汪10万接的多平台视频分发项目&#xff0c;模拟人工发视频 视频版本 在 …

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…

路径规划——曲线拟合详解(二):贝塞尔曲线、B样条曲线与QP优化( Fast-Planner算法核心部分)

1. 贝塞尔曲线 (1). 贝塞尔曲线的作用 贝塞尔曲线的作用是给定控制点&#xff0c;通过控制点生成对应的曲线进行轨迹拟合&#xff0c;输入为点&#xff0c;输出为受到控制点约束而产生的轨迹。 (2). 贝塞尔曲线的数学表达式 假设给定N个控制点&#xff0c;得到的为N-1阶的贝…

【Segment Anything Model】十三:Meta的最新工作EfficientSAM,微调到自己的数据集,代码。

&#x1f349; 博主微信 cvxiayixiao 还有其他专栏点击头像查询 &#x1f353; 【Segment Anything Model】计算机视觉检测分割任务专栏。 &#x1f351; 【公开数据集预处理】特别是医疗公开数据集的接受和预处理&#xff0c;提供代码讲解。 &#x1f348; 【opencv图像处理】…

【LeetCode热题100】118. 杨辉三角(动态规划)

一.题目要求 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 二.题目难度 简单 三.输入样例 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示…

Android Studio gradle-8.4 配置 GreenDao

1.配置项目下的build buildscript {repositories {mavenCentral()}dependencies {classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")classpath ("org.greenrobot:greendao-gradle-plugin:3.3.1") // 使用最新版本} } 2.配置app下的build i…

跨越网络边界:借助C++编写的下载器程序,轻松获取Amazon商品信息

背景介绍 在数字化时代&#xff0c;数据是新的石油。企业和开发者都在寻找高效的方法来收集和分析网络上的信息。亚马逊&#xff0c;作为全球最大的电子商务平台之一&#xff0c;拥有丰富的商品信息&#xff0c;这对于市场分析和竞争情报来说是一个宝贵的资源。 问题陈述 然…

持续交付工具Argo CD的部署使用

Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…

自定义gitlog格式

git log命令非常强大而好用&#xff0c;在复杂系统的版本管理中扮演着重要的角色&#xff0c;但默认的git log命令显示出的东西实在太丑&#xff0c;不好好打扮一下根本没法见人&#xff0c;打扮好了用alias命令拍个照片&#xff0c;就正式出道了&#xff01; 在使用git查看lo…

【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…