代码随想录Day34 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

代码随想录Day34 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

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

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

文档讲解:代码随想录
视频讲解: 贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和
状态

尽可能翻转所有负数,如果k比负数个数多,那么就不断翻转最小的数(包括负数的绝对值)。

//选择最小的数进行翻转
class Solution {
public:
    int largestSumAfterKNegations(vector& nums, int k) {
        sort(nums.begin(),nums.end());
        //统计负数
        int nenums = 0;
        for(int i = 0;i nums[nenums] ? nums[nenums] : (-1*nums[nenums-1]);
                res -= temp;
                int a = k-nenums;
                while(a--)
                {
                    temp = -1*temp;
                }
                res+=temp;
            }
            else
            {
                for(int i = 0;i

代码随想录中给出了另外一种方法,不用考虑这么多情况,即按绝对值排序,然后遇到负数翻转,并记录k的变化,如果遍历完k还有那么就一直翻转最小的数,直到k用完。

//选择最小的数进行翻转
class Solution {
static bool cmp(int a,int b)
{
    return abs(a) > abs (b);
}
public:
    int largestSumAfterKNegations(vector& nums, int k) {
        sort(nums.begin(),nums.end(),cmp);
        for(int i =0;i0)
            {
                k--;
                nums[i] *= -1;
            }
        }
        if(k%2 == 1) 
        {
            nums[nums.size()-1] *= -1;
        }
        int res = 0;
        for(int i=0;i

134.加油站

文档讲解:代码随想录
视频讲解: 贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站
状态

局部最优:一个连续区间内的省油量之和大于0,说明一定可以在这个区间循环,如果小于0,那么就需要更新区间的起点重新计算。

class Solution {
public:
    int canCompleteCircuit(vector& gas, vector& cost) {
        //记录当前这个区间的剩油量
        int curres = 0;
        //记录整个数组的剩油量
        int totalres = 0;
        //需要更新的起始点
        int res = 0;
        for(int i=0;i

135.分发糖果

文档讲解:代码随想录
视频讲解: 贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果
状态

考虑左右对中间的影响,可以先考虑一边,在考虑另一边时,增加判断即可
对于这道题,可以先只考虑当前孩子的评分比左边孩子高的情况,那么就是左边孩子的糖果数+1.
接着考虑当前孩子的评分比右边孩子高的情况,同样是右边孩子的糖果数+1,但由于之前有左边孩子的影响,为了满足左右两边孩子的共同影响,应当选择两个结果的最大值

//i+1 比 i 大那么就增加一个糖果
//i-1比i 大 那么也增加一个糖果
class Solution {
public:
    int candy(vector& ratings) {
        //首先初始化糖果数组全为1
        vector candy(ratings.size(),1);

        //先考虑右边孩子比左边大的情况 比较当前位置和其左边位置
        //如果大,那么就加1
        for(int i=1;i=0;i--)
        {
            if(ratings[i+1]

你可能感兴趣的:(算法)