• Day34——K次取反后最大化的数组和、加油站、分发糖果


    第34天

    目录

    前言

    一、K次取反后最大化的数组和

    1、暴力思路:

    但这是时间复杂度比较大的解法,我们还可以改善一下。

    2、贪心思路:

    二、加油站

    1、贪心思路1:

    2、贪心思路2:

    三、分发糖果

    总结


    前言

    思念折腾人,也锻炼人,更锻造人的性格的沉稳和感情的深沉。思念别人是一种温馨,被人思念是一种幸福


    一、K次取反后最大化的数组和

    力扣

    1、暴力思路:

    在k还没有用完前,每次选择最小的元素,把它取反,这样就能得到最大的和。

    1. class Solution {
    2. public:
    3. int largestSumAfterKNegations(vector<int>& nums, int k) {
    4. while(k--) //记录K的次数
    5. {
    6. int min=1e8;
    7. int j=0;
    8. for(int i=0;isize();i++)
    9. {
    10. if(nums[i]//找出最小值
    11. {
    12. min=nums[i];
    13. j=i;
    14. }
    15. }
    16. nums[j]=-nums[j]; //反
    17. }
    18. int sum=0;
    19. for(int i=0;isize();i++) //记录和
    20. {
    21. printf("%d ",nums[i]);
    22. sum+=nums[i];
    23. }
    24. return sum;
    25. }
    26. };

    但这是时间复杂度比较大的解法,我们还可以改善一下。

    2、贪心思路:

    要先和最大。

    1、把负数全部变成正数。

    2、如果全是正数,把最小的正数变成负数。

    1. class Solution {
    2. public:
    3. static bool cmp(int a,int b) //按绝对值
    4. {
    5. return abs(a)>abs(b);
    6. }
    7. int largestSumAfterKNegations(vector<int>& nums, int k) {
    8. sort(nums.begin(),nums.end(),cmp); //按绝对值从大到小排序
    9. int i=0;
    10. for(i=0;isize();i++)
    11. {
    12. if(nums[i]<0) //负数都反
    13. {
    14. nums[i]=-nums[i];
    15. k--;
    16. }
    17. if(k==0) //用完了就退出了
    18. {
    19. break;
    20. }
    21. }
    22. if(k%2==1) //剩余的看单双数,双数等于不变
    23. {
    24. nums[nums.size()-1]*=-1; //末尾最小
    25. }
    26. int sum=0;
    27. for(auto it:nums)
    28. {
    29. sum+=it;
    30. }
    31. return sum;
    32. }
    33. };

    二、加油站

    力扣

    在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

    你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

    给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

    1、贪心思路1:

    在确定了是可以跑一圈的情况下,在中间出现了负值,说明从0到负值位置开始是行不通的,要从后面往前,找到那个可以补缺的点哪里。

    1. class Solution {
    2. public:
    3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    4. int min=1e8;
    5. int sum=0;
    6. for(int i=0;isize();i++)
    7. {
    8. sum+=gas[i]-cost[i]; //从0开始跑计算总油量
    9. if(sum
    10. {
    11. min=sum; //记录最小的负值
    12. }
    13. }
    14. if(sum<0) //小于0就退出,因为不可能跑一圈了
    15. {
    16. return -1;
    17. }
    18. if(min>=0) //如果从0开始跑可以跑一圈就返回0
    19. {
    20. return 0;
    21. }
    22. for(int i=gas.size()-1;i>=0;i--) //从后往前遍历
    23. {
    24. min+=gas[i]-cost[i]; //啥时候可以填补空缺
    25. if(min>=0)
    26. return i;
    27. }
    28. return -1;
    29. }
    30. };

    2、贪心思路2:

    如果cursum小于0了,那么【0,i】上面开始都是不行的。

    1. class Solution {
    2. public:
    3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    4. int curSum = 0;
    5. int totalSum = 0;
    6. int start = 0;
    7. for (int i = 0; i < gas.size(); i++) {
    8. curSum += gas[i] - cost[i];
    9. totalSum += gas[i] - cost[i];
    10. if (curSum < 0) { // 当前累加rest[i]和 curSum一旦小于0
    11. start = i + 1; // 起始位置更新为i+1
    12. curSum = 0; // curSum从0开始
    13. }
    14. }
    15. if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
    16. return start;
    17. }
    18. };

    三、分发糖果

    力扣

    1. class Solution {
    2. public:
    3. int candy(vector<int>& ratings) {
    4. vector<int> candys(ratings.size(),1);
    5. for(int i=1;isize();i++) //右孩子大于左孩子
    6. {
    7. if(ratings[i]>ratings[i-1])
    8. {
    9. candys[i]=candys[i-1]+1; //比旁边的孩子多一个
    10. }
    11. }
    12. for(int i=ratings.size()-2;i>=0;i--) //重点,重后往前
    13. {
    14. if(ratings[i]>ratings[i+1])
    15. {
    16. candys[i]=max(candys[i],candys[i+1]+1);
    17. }
    18. }
    19. int sum=0;
    20. for(auto it:candys)
    21. sum+=it;
    22. return sum;
    23. }
    24. };

    为什么要从后往前呢,从后往前,我们可以用处理过的结果来判断,因为前一个是处理过的,从前往后,就是依据前一个判断后一个,前一个都是没有处理过的。


    总结

    贪心没有套路,只有一点感觉,继续加油哇。

  • 相关阅读:
    数据结构——KD树
    基于51单片机信号发生器仿真设计
    [go学习笔记.第十一章.项目案例] 2.客户信息管理系统
    用上了Jenkins,个人部署项目真方便!
    istio系列:番外一 外网到内网访问配置实例
    JavaWeb在线问题.Linux服务器MEM内存核查
    《痞子衡嵌入式半月刊》 第 95 期
    【CVE-2023-4357】Chrome-XXE 任意文件读取漏洞复现及原理解析
    Scikit-LLM:一款大模型与 scikit-learn 完美结合的工具!
    特征工程中的缩放和编码的方法总结
  • 原文地址:https://blog.csdn.net/m0_72503424/article/details/127896803