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

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

时间:2024-06-10 20:54:33浏览次数:12  
标签:ratings nums int 随想录 取反 candys 135 糖果 size

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

题目链接 文章讲解 视频讲解

思路:
  按绝对值从大到小排序
  遍历数组,遇到负数,如果次数未用完就取反
  最后如果剩余次数未用完且为奇数就将数组最后一个元素取反

class Solution {
    static bool myCompare(const int& lhs, const int& rhs) {
        return abs(lhs) > abs(rhs);
    }
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int result = 0;
        sort(nums.begin(), nums.end(), myCompare);
        for(int i = 0; i < nums.size(); ++i) {
            if(nums[i] < 0 && k > 0) {
                nums[i] *= -1;
                --k;
            }
        }
        // 处理剩余的次数
        if(k % 2 == 1) nums[nums.size() - 1] *= -1;

        for(int val : nums) result += val;
        return result;
    }
};

134.加油站

题目链接 文章讲解 视频讲解

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        // 记录最后剩余的油量
        int totalSum = 0;
        // 记录当前剩余的油量
        int curSum = 0;
        int startIndex = 0;
        for(int i = 0; i < gas.size(); ++i) {
            curSum += (gas[i] - cost[i]);
            totalSum += (gas[i] - cost[i]);
            // 如果当前剩余油量为负数,那么从下一个位置开始重新记录
            if(curSum < 0) {
                startIndex = i + 1;
                curSum = 0;
            }
        }
        if(totalSum < 0) return -1;
        return startIndex;
    }
};

135.分发糖果

题目链接 文章讲解 视频讲解

思路:
  先从左向右遍历,如果当前孩子的分数相较于前者高,则糖果数为前者加一
  如果没有前者高则默认为1
  再从后向前遍历,如果当前孩子得分比后者高,则再当前糖果和后者糖果加一的糖果数中取更大的一个
  同时累加总的糖果数

class Solution {
public:
    int candy(vector<int>& ratings) {
        int total = 0;
        vector<int> candys(ratings.size(), 1);
        // 从前向后遍历,保证比左边的孩子得分高者符合要求
        for(int i = 1; i < ratings.size(); ++i) {
            if(ratings[i] > ratings[i - 1]) {
                candys[i] = candys[i - 1] + 1;
            }
        }
        total += candys[ratings.size() - 1];
        // 从右向左遍历,保证比右边孩子得分高者符合要求
        for(int i = ratings.size() - 2; i >= 0; --i) {
            if(ratings[i] > ratings[i + 1]) candys[i] = max(candys[i], candys[i + 1] + 1);
            total += candys[i];
        }
        return total;
    }
};

标签:ratings,nums,int,随想录,取反,candys,135,糖果,size
From: https://www.cnblogs.com/cscpp/p/18241028

相关文章

  • 代码随想录——数组
    给定一个n个元素有序(升序)的整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1.//这个题说实话从逻辑上来看实在是太简单了,但是为什么每一次我写起来都感觉隐隐约约有点问题,为什么呢?就是因为我的问题没有得到解决,我只是一味的去逃......
  • 代码随想录算法训练营第六天
    哈希表常见的三种哈希结构:数组、set(集合)、map(映射)要快速判断一个元素是否出现集合里,考虑哈希法!242.有效的字母异位词题目:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。解题:......
  • 代码随想录算法训练营第十四天|二叉树递归遍历、迭代遍历、统一迭代
    二叉树遍历二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走。深度优先遍历又分:前序遍历(中、左、右)中序遍历(左、中、右)后序遍历(左、右、中)广度优先遍历:一层一层的去遍历。(后面讲)递归遍历递归三要素确定递归函数的参数和返回值:确定哪些参数是递......
  • C135 线段树分治 P5631 最小mex生成树
    视频链接: P5631最小mex生成树-洛谷|计算机科学教育新生态(luogu.com.cn)//线段树分治O(nlognlogw)#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;#definels(u<<1)#definers(u<<1|1)#d......
  • P1355 神秘大三角(凸包)
    P1355神秘大三角-洛谷|计算机科学教育新生态(luogu.com.cn)队友推荐的,算是入门凸包,就是用叉积判断一下点是否相对每条边都在凸包的边的左侧。1#include<bits/stdc++.h>23usingnamespacestd;45#definelllonglong67constintN=1e3+10;......
  • Day47 代码随想录打卡|二叉树篇---最大二叉树
    题目(leecodeT654):给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nu......
  • 代码随想录算法训练营 day31 | 455.分发饼干 376.摆动序列 53.最大子数组和
    376.摆动序列说实话,没明白为啥算是贪心。最开始的思路是去重,然后统计正负变化次数。classSolution{public:intwiggleMaxLength(vector<int>&nums){if(nums.size()==1)return1;intans=0,last=-2,now;for(inti=1;i<nums.size();......
  • 代码随想录第4天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 0
    题目:24.两两交换链表中的节点思路:设置虚拟头结点,双指针+临时指针,(感觉也能递归,未尝试)时间复杂度:O(n)空间复杂度:O(1)坑:1.又忘了else{}和return2.试图访问空指针,多个条件的顺序问题及"&&""||"问题,cur->next要写在cur->next->next前面/***Definitionforsingly-linked......
  • 代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机 55.跳跃游戏 45.跳跃游戏I
    122.买卖股票的最佳时机II题目链接文章讲解视频讲解思路:每次记录当天的股票价格,如果下一天比今天的价钱高那么今天就买,这样保证每一次买股票都是赚的否则记录下一天的股票,因为下一天的股票比今天的便宜,下一天买比今天买划算classSolution{public:intmaxProfit(v......
  • 代码随想录算法训练营第四天 |
    24.两两交换链表中的节点题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。解题:关键:cur的位置在要交换的两个节点的前面具体如何交换的操作!!while种植条件:cur的下一个和下下个都不为空,不......