Day33|贪心算法part3

k次取反后最大的数组元素和

思路:贪心,局部最优,让绝对值大的负数变正数,当前数值达到最大,整体最优;整个数组和达到最大。如果把序列中所有负数都转换为正数了,k还没耗尽,就是k还大于0,那就反复转换排序后的比较小的那个元素,把k耗尽,这时候对总和的损耗会比较小,是不可避免的损耗了。

复制代码
class Solution{
static bool cmp(int a,int b){
    return abs(a) > abs(b);//abs是取绝对值
}
public:
    int largestSumAfterKNegations(vector<int>&A,int K){
        sort(A.begin(),A.end(),cmp);//按绝对值大小排序
        for(int i = 0;i < A.size(); i++){//从前往后遍历,将负数转换成正数
            if(A[i] < 0 && K > 0){
                A[i]*= -1;
                K--;
            }
        }
        if(K & 2 == 1)A[A.size() - 1]*= -1;//对排序后的最后一个元素反复变换正负,消耗k
        int result = 0;
        for(int a : A)result += a;//求和
        return result;
    }
}

加油站

思路:贪心的思路1,直接从全局出发考虑:

第一种情况,如果gas的总和小于cost总和,那么无论从哪里出发都跑不了一圈。

第二种情况,resti = gasi - costi为一天剩下的油,i从0开始计算累加到最后一站,如果累加没出现负数,说明0就是起点。

第三种情况,如果累加的最小值是负数,汽车就要从非0节点出发,从后往前看,那个节点能把gasi-costi给填平了,那它就是起点。

复制代码
class Solution{
    public:
       int canCompleteCircuit(vector<int>&gas,vector<int>&cost){
           int curSum = 0;
           int min = INT_MAX;//从起点出发,油箱里的油量最小值
           for(int i = 0; i < gas.size();i++){
              int rest = gas[i] - cost[i];//一天剩下的油
              curSum += rest;//累加每天剩下的
              if(curSum < min){
                min = curSum;//如果最终一天剩下的油量比油箱油量最小值还小,将剩余油量记录在min内
              }
           }
           if(curSum < 0)return -1;//总和小于0,返回-1
           if(min >= 0)return 0;//油量最小值>0,返回0
           for(int i = gas.size() - 1; i >= 0;i--){//以上两个都不是
            int rest = gas[i] - cost[i];          
            min += rest;                      //累加后最小值不是负数就返回节点i,是负数就继续遍历找节点
            if(min >= 0){
                return i;
            }
           }
           return -1;
       }
}

贪心思路2:

如果总油量减去总消耗大于等于0一定可以跑完一圈,也就是各个站点的加油站剩油量resti 为gasi - costi。

i从0开始累加resti,和记为curSum,一旦curSum小于0,说明0,i区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到这里都会断油,那么起始位置往前推一个节点到i+1,再次从0计算curSum,合适就是它了,返回,不合适,继续推。

局部最优:当前累加resti的和curSum一旦小于0,起始位置至少是i + 1,因为从i之前开始一定不行。全局最优,找到可以跑一圈的起始位置。
来自Leetcode的Gnakuw的图解

相关推荐
aichitang202433 分钟前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码1 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-1 小时前
两数之和-C++实现
c++·算法
j7~1 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号1 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..2 小时前
【C++】类和对象
c++·算法
D e re k ZH2 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
释厄6233 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
暴力求解3 小时前
C++ ---继承(二)
开发语言·c++·算法
码林拾遗WJ4 小时前
告警分级的自动化实测:模型判断 vs 人工拍板
人工智能·算法·自动化