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

1005.

comparator

static bool cmp(int a, int b) {return abs(a) > abs(b);}

operator

bool operator>(const comparator<int>& r_value_) const final { return it_>r_value_.GetValue(); }

看着简单,好几个坑。

自定义的comparator是降序的,这样才可以先翻转最小的值(abs最大的负数),且最后在最小的值上正负翻转的时候记得对最后一个元素操作,因为那才是最小的abs

cmp的写法和用法

 134.

暴力解法:forloop套whileloop,细节很多,且O(n)会超时

for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历

全局算法不好想:

从idx=0开始forloop求cursum,每次都加能攒下来的油量。如果最后的cursum小于零,那么说明gas总和小于cost总和,说明就不够油,返回-1

同时求出最小的cursum,在最后cursum大于等于零且最小cursum大于等于零的情况下,说明油从来没断过,因此返回0就行

如果出现了最小cursum小于零的情况,就需要找到哪个节点开始能攒n的gas使得那个小于零的cursum被填上.

最小cursum(-6)的地方是指,从index0开始,cursum增增减减,但会在这个地方达到最小。从后往前遍历是因为我们要从size - 1,0,1,2...(或size - 2,size -1,0,1...,或。。。)这样加看到mincursum的地方会不会是零。mincursum本身已经包含了从idx0开始的积累,所以只用把后面的加上就行。

怎么mincursum之前的小于零的cursum也被填满?cursum本身是累积来的,所以如果后面的正数可以填满mincursum,那就一定也可以填满之前的负数cursum。

135.

这道题的要点在于,只要从前往后和从后往前两个顺序中每两个元素之间都满足了规则,那么整个数列就都满足了。

从前往后的时侯

candies[i] = candies[i - 1] + 1;

就行。

但是从后往前的时候,要保留之前从前往后的数量关系,同时也要使从后往前满足规则。所以取一个

candies[i] = max(candies[i], candies[i+1] + 1);

 大的肯定两个顺序的规则都能满足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值