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);
大的肯定两个顺序的规则都能满足。