Leetcode - 1005:k次取反后最大化数组和
这道题的思路是如果数组内存在负数首先将负数变为正数然后再检查k的次数是否用尽,如果没有用尽就将当前数组内最小的值取反剩余的k - n 次:
具体操作如下:先对原数组进行排序,用i来当作指针遍历负数,判断nums[i]是否为负数,如果是进入while循环直到nums[i]>0退出。接着处理正数部分,我们再次将数组进行排序,然后选取0位置的数进行剩余次数的反转最后得到的数组就是最大值。要注意的是while循环的条件我们一定要先判断i是否越界再进行nums[i]的判断。
Leetcode - 134:加油站
这道题的思路就是:先求出每个加油站对应的gas - cost,再从第1个加油站开始往后遍历,并不断的累加这些差值,如果累加的和 < 0,就说明前面这段路走不了,到不了下一个节点了,那么我们就从下一节点开始重新寻找。如果到了尽头,那么这个节点就是出发点。这样看可能有些抽象:
我们从总体来看。如果我们的gas < cost那么我们一定到不了终点。所以我们的cur数组是一定>0的,接着来看,如果我们遇到一个节点时的前面的累加和为负数,那么根据我们总的cur>0可以想到,从这一点到最后一个点的所有的累加和一定是>0的不然两者相加不可能大于0,所以遇到了负数说明上一个区间的起点不合法,我们要从下一个节点开始。
Leetcode - 135:分发糖果
这道题的思路是:我们不要想着一次for循环就将问题解决;将问题分治解决:首先我们的局部最优解是:从两个相邻的元素中找到评分高的元素并将其数值改为评分低数值+1,接着一直向右遍历,再从最右端开始,逐步依照上面的思路遍历到最左端。由这个局部最优解就求得了全局最优解。