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

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

前言


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

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


力扣

1、暴力思路:


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

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
    while(k--)                    //记录K的次数
        {
            int min=1e8;            
            int j=0;
            for(int i=0;i<nums.size();i++)
            {
        if(nums[i]<min)            //找出最小值
                {
          min=nums[i];
                    j=i;
                }
            }
            nums[j]=-nums[j];        //反
        }
        int sum=0;
        for(int i=0;i<nums.size();i++)        //记录和
        {
            printf("%d ",nums[i]);
      sum+=nums[i];
        }
        return sum;
    }
};

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

2、贪心思路:


要先和最大。

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

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

class Solution {
public:
    static bool cmp(int a,int b)        //按绝对值
    {
        return abs(a)>abs(b);
    }
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end(),cmp);        //按绝对值从大到小排序
        int i=0;
        for(i=0;i<nums.size();i++)            
        {
            if(nums[i]<0)                    //负数都反
            {
                nums[i]=-nums[i];
                k--;
            }
            if(k==0)                //用完了就退出了
            {
                break;
            }
        }
        if(k%2==1)                    //剩余的看单双数,双数等于不变
        {
            nums[nums.size()-1]*=-1;        //末尾最小
        }
        int sum=0;
        for(auto it:nums)
        {
            sum+=it;
        }
        return sum;
    }
};

二、加油站


力扣

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

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

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

1、贪心思路1:


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

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int min=1e8;
        int sum=0;
    for(int i=0;i<gas.size();i++)
        {
            sum+=gas[i]-cost[i];            //从0开始跑计算总油量
      if(sum<min)
            {
                min=sum;            //记录最小的负值
            }
        }
        if(sum<0)        //小于0就退出,因为不可能跑一圈了
        {
            return -1;
        }
            if(min>=0)        //如果从0开始跑可以跑一圈就返回0
        {
          return 0;
        }
        for(int i=gas.size()-1;i>=0;i--)    //从后往前遍历
        {
            min+=gas[i]-cost[i];        //啥时候可以填补空缺
            if(min>=0)
            return i;
        }
        return -1;
    }
};

2、贪心思路2:


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

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for (int i = 0; i < gas.size(); i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start;
    }
};

三、分发糖果


力扣

class Solution {
public:
    int candy(vector<int>& ratings) {
        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;        //比旁边的孩子多一个
            }
        }
        for(int i=ratings.size()-2;i>=0;i--)        //重点,重后往前
        {
            if(ratings[i]>ratings[i+1])
            {
                candys[i]=max(candys[i],candys[i+1]+1);
            }
        }
        int sum=0;
        for(auto it:candys)
        sum+=it;
        return sum;
    }
};

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

总结


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

相关文章
|
Python
619: 蟠桃记(python)
619: 蟠桃记(python)
116 2
|
9月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
11月前
|
搜索推荐 算法 数据挖掘
探讨淘宝商品 API 接口:运用及收益
在电商蓬勃发展的今天,淘宝作为国内巨头,拥有海量商品数据和庞大用户群体。淘宝商品API接口为开发者、电商从业者和数据分析师提供了丰富的商品信息,如详情、价格、销量、评价等,助力电商平台搭建、推荐系统优化、市场调研及竞品分析,显著提升业务收益。本文将深入探讨该接口的运用方法与价值,并结合实际代码示例,帮助读者更好地理解和应用。
324 6
|
XML 安全 Java
Spring Boot中使用MapStruct进行对象映射
本文介绍如何在Spring Boot项目中使用MapStruct进行对象映射,探讨其性能高效、类型安全及易于集成等优势,并详细说明添加MapStruct依赖的步骤。
499 0
npm报错:npm ERR! code ECONNREFUSED npm ERR! errno ECONNREFUSED,npm ERR! npm ERR! If you are behind a
npm报错:npm ERR! code ECONNREFUSED npm ERR! errno ECONNREFUSED,npm ERR! npm ERR! If you are behind a
436 0
|
存储 传感器 缓存
Nvidia Isaac Sim安装与配置 入门教程 2024(2)
本文是Nvidia Isaac Sim安装与配置的入门教程,指导用户如何检查系统配置、安装Omniverse环境、配置Nucleus服务器、安装Isaac Sim软件包、设置命令行环境和编辑器环境,以及如何启动Isaac Sim仿真和加载机器人与环境。
4997 0
|
存储 Java C++
15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized(上)
15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized
|
消息中间件 Java Kafka
Apache Kafka-初体验Kafka(04)-Java客户端操作Kafka
Apache Kafka-初体验Kafka(04)-Java客户端操作Kafka
153 0
|
容器
FFmpeg读取文件内容AVPacket
FFmpeg读取文件内容AVPacket
343 0
|
机器学习/深度学习 存储 并行计算
BladeDISC 0.2.0更新发布
在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优化与功能增强。
BladeDISC 0.2.0更新发布