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

文章讨论了解决LeetCode中的三道题目:1005题取反后最大化数组和,通过排序和取反操作;134题加油站问题,涉及路径规划和累加判断;135题分发糖果,采用分治法求解。展示了如何运用策略优化算法解决这些问题。
摘要由CSDN通过智能技术生成

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,接着一直向右遍历,再从最右端开始,逐步依照上面的思路遍历到最左端。由这个局部最优解就求得了全局最优解。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值