day34代码回想录 K次取反后最大化的数组和&加油站&分发糖果

大纲

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

● 134. 加油站

● 135. 分发糖果

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

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

题目:

本题的思路是对数组按照绝对值从小到大排序后,将排序后数组小于0的部分先进行反转,如果k还有,那么将绝对值最小值【nums[0]】进行反复反转,消耗完剩下的反转次数,则可以最大化数组和

复制代码
// 排序函数,按照绝对值从小到大排序
bool _compareAbs(int a, int b) {
    return abs(a) < abs(b);
}

int kthReveaseArray(vector<int>& nums, int k) {
    // 按照绝对值排序
    sort(nums.begin(), nums.end(), _compareAbs);
    int sum = 0;
    for (int i = nums.size() - 1; i >= 0; --i) {
        if (nums[i] < 0 && k-- > 0)
            nums[i] = -nums[i];
    }
    // k还有那么反复反转绝对值最小的值
    if (k % 2 == 1) nums[0] = -nums[0];
    for (int i = 0; i < nums.size(); ++i) {
        sum += nums[i];
    }

    return sum;
}

134. 加油站

题目:134. 加油站

本题比较难想到,需要遍历汽油数组,统计**走到当前节点总共剩下的汽油数量 totalLeft 从start开始时剩下的汽油数量singleLeft **,如果singleLeft 小于0了,那么说明以start开始的节点是行不通的,已经耗完了汽油。遍历完汽油数组后,如果totalLeft 还大于0,则返回start作为起点

复制代码
int getGasCost(vector<int>& gas, vector<int>& cost) {
    int start = 0, totalLeft = 0, singleLeft = 0;
    for (int i = 0; i < gas.size(); ++i) {
        singleLeft += gas[i] - cost[i];
        totalLeft += gas[i] - cost[i];
        if (singleLeft < 0) {
            start = i + 1;
            singleLeft = 0;
        }
    }
    if (totalLeft >= 0) return start;
    return -1;
}

135. 分发糖果

题目:135. 分发糖果

本题看看解题参考吧

复制代码
int candy(vector<int>& ratings) {
        vector<int> candyVec(ratings.size(), 1);
        // 从前向后
        for (int i = 1; i < ratings.size(); i++) {
            if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
        }
        // 从后向前
        for (int i = ratings.size() - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1] ) {
                candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
            }
        }
        // 统计结果
        int result = 0;
        for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
        return result;
    }
相关推荐
夜思红尘4 小时前
算法--双指针
python·算法·剪枝
散峰而望5 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo5 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……5 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L5 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
在风中的意志5 小时前
[数据库SQL] [leetcode] 2388. 将表中的空值更改为前一个值
数据库·sql·leetcode
智者知已应修善业6 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
还不秃顶的计科生6 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
LYFlied6 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0117 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表