代码随想录第29天|贪心

news2024/11/17 6:52:40

134.加油站

代码随想录

 代码随想录

索引01234
gas12345
cost34512

计算每个加油站的剩余油量,累计sum,一旦<0就从下一个重新计数。

我还没理解为什么我们不需要计算环路的sum,而是只需要遍历一次。

因为使用了两个变量:curSum 和totalSum ,totalSum最终一旦小于0,说明怎么都不可能跑完一圈。curSum是为了求取出发点。

假设直到B点curSum才<0,意味着从A点出发,初始油箱是有油的,油箱有油都无法到达,从A点重新出发,油箱为空的情况下,又怎么能到达呢? 同样的,到达C点时油箱有油,意味着肯定比从C点开始出发更稳妥,更优,因为解唯一,所以一定是最优的那个。这也解释了为什么题目是环路,而我们只需要顺序遍历一次。

代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for(int i = 0;i<gas.length;i++){
            curSum += (gas[i] - cost[i]);
            totalSum += (gas[i]-cost[i]);
            if(curSum<0){
                start = i+1;
                curSum = 0;
            }
        }
        if(totalSum<0)return -1;
        return start;
    }
}

 135.分发糖果

代码随想录

 代码随想录

一次遍历两边都要考虑会顾此失彼,正确思路是先确定一边,再确定另一边。

正序先确定一边,因为第一个小孩糖果数确定为1:右边小孩比左边小孩得分高,if(right>left) candy[i] = candy[i-1]+1;

倒序再确定另一边,因为最后一个小孩糖果数确定为1:左孩子比右边孩子得分高,if(left

>right) candy[i] = Math.max(candy[i-1]+1,candy[i]);

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

关于倒序取Max值的困惑:

 问:听不懂为什么可以取最值就行了。第一遍遍历得到的糖果,取决于他左边的小孩的糖果数,和这两个人的相对大小关系,第二遍遍历得到的糖果,取决于他右边小孩的糖果数和他们两个人的大小关系,取最大值不会破坏第一遍遍历的相对关系吗?

答:

你想吧,对于第i个元素来说,假设它比左边的元素(第i-1个)大。第一次遍历使得第i个元素比它左边的元素(第i-1个)大对吧;第二次遍历的时候,第i个元素要么持平,要么增大(max操作),所以第二次遍历结束后,第i个元素还是比他左边的元素大是吧,所以就没有破坏第一次的遍历结果呀~

代码

class Solution {
    public int candy(int[] ratings) {
        int[] candy = new int[ratings.length];
        candy[0] = 1;
        for (int i = 1;i<ratings.length;i++){
            candy[i] = (ratings[i]>ratings[i-1])?candy[i-1]+1:1;
        }
        for(int i = ratings.length-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                candy[i] = Math.max(candy[i+1]+1,candy[i]);
            }
        }
        return getSum(candy);
    }
    public int getSum(int[] candy){
        int sum = 0;
        for (int i : candy) {
            sum+=i;
        }
        return sum;
    }
}

 860.柠檬水找零

代码随想录

代码

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int fiveCount = 0;
        int tenCount = 0;
        for(int i = 0;i<bills.length;i++){
            if(bills[i]==5) {
                fiveCount++;
            }else if(bills[i]==10){
                tenCount++;
                fiveCount--;
            }else if(bills[i]==20){
                if(tenCount>0){
                    tenCount--;
                    fiveCount--;
                }else{
                    fiveCount = fiveCount-3;
                }
            }
            if(fiveCount<0||tenCount<0){
                return false;
            }
        }
        return true;
    }
}

406.身高排序[代码重刷]

代码随想录

 代码随想录

先确定H维度;按照身高从大到小排列,当身高相同时按照K从小到大排列。就保证了数组向前插入时前面的人身高一定比它高,从而保证被插入的数组K值不会有任何影响。

再确定K维度:再按照K值插到前面的位置。

代码

Arrays.sort自定义排序使用,LinkedList适合挪动元素插入删除操作,linkedList转换成nt[][]数组,这些调用都不会,因此需要代码重刷

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{
            if(a[0]==b[0]) return a[1]-b[1];//身高相同时,按照K值升序排列
            return b[0]-a[0];//否则直接按照身高降序排列
        });
        LinkedList<int[]> deque = new LinkedList<>();
        for (int[] person : people) {
            deque.add(person[1],person);
        }
        return deque.toArray(new int[people.length][]);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java ExecutorService:你真的了解它吗?

文章目录 一、什么是ExecutorService&#xff1f;二、ExecutorService的核心功能三、如何创建和使用ExecutorService&#xff1f; 时光匆匆&#xff0c;又来到另一个里程碑&#xff0c;感谢粉丝们的陪伴&#xff0c;有你们真好~ 不水文啦&#xff0c;一起加油叭~ 一、什么是Exe…

【Java】Jsoup 解析HTML报告

一、需求背景 有好几种报告文件&#xff0c;目前是人肉找报告信息填到Excel上生成统计信息 跟用户交流了下需求和提供的几个文件&#xff0c;发现都是html文件 其实所谓的报告的文件&#xff0c;就是一些本地可打开的静态资源&#xff0c;里面也有js、img等等 二、方案选型 前…

adb环境变量配置(附详细图解)

adb环境变量配置&#xff08;附详细图解&#xff09; 1、找到ADB工具的位置。通常&#xff0c;如果你Android Studio已经安装了Android SDK&#xff0c;ADB工具位于SDK的platform-tools目录下。我这里的目录是C:\Users\user\AppData\Local\Android\Sdk\platform-tools\adb.exe…

微信防封指南请收好

一、新号与老号的添加限制 建议新注册的微信号主动添加好友的数量不宜过多&#xff0c;推荐每日添加不超过5个好友&#xff1b;对于老号&#xff0c;建议每日添加不超过20个好友。保持适度的添加速度&#xff0c;避免被系统判定为异常操作。 二、避免使用营销性词汇 在发送消…

【计算机视觉】图像处理基本知识

一 基本的图像操作和处理 1.1 PIL&#xff1a;Python图像处理类库 PIL&#xff08;Python Imaging Library&#xff0c;图像处理库&#xff09;提供了通用的图像处理功能&#xff0c;以及大量有用的基本图像操作。PIL库已经集成在Anaconda库中&#xff0c;推荐使用Anaconda&a…

openmetadata自定义连接器开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

【ARM】SMMU系统虚拟化(3)_ VMSAv8-64 address translation stages

讲解颗粒度granule size如何影响地址转换的过程&#xff1a; 对于每个颗粒度来说&#xff1a; 输入的地址范围如何影响起始的lookup levels。对于stage2 转换来说&#xff0c;给链接的转换页表造成的可能的影响。TTBR 地址和indexing对于起始的lookup 1.以4KB的translation g…

初始JVM ! ! ! 相信我,中国人不骗中国人,这一篇也就入门了!!!

目录 1.JVM到底是什么&#xff1f; 2.JVM的三大核心是什么&#xff1f; 1. 解释和运行 2. 内存管理 3. 即时编译&#xff08;JIT&#xff09; 3.常见的Jvm虚拟机有哪些&#xff1f; 1.3.1 Java虚拟机规范 1.3.2 Java虚拟机规范 4. JVM的组成 4.1、类的生命周期 4.1…

Android手机端远程控制ESP32引脚电平实例

一、背景介绍 ESP32是一款高度集成的低功耗系统级芯片&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;适用于各种物联网&#xff08;IoT&#xff09;应用&#xff0c;如果与Android结合&#xff0c;在手机端远程控制ESP32引脚高低电平输出&…

武汉流星汇聚:依托亚马逊平台助力初创企业出海,共创国际品牌辉煌

在全球跨境电商的浩瀚蓝海中&#xff0c;亚马逊如同一座灯塔&#xff0c;以其庞大的市场规模、强大的品牌影响力和成熟的运营体系&#xff0c;引领着无数企业扬帆出海&#xff0c;探索未知的市场机遇。对于中国卖家而言&#xff0c;亚马逊不仅是通往全球消费者的桥梁&#xff0…

一文详解:企业优化仓库管理——WMS系统

如有你有一间小仓库&#xff0c;几位工人埋头于一摞摞的纸质单据中&#xff0c;手工记录着每一次货物的进出与变动。目前看来&#xff0c;这样的时间和效率&#xff0c;作为管理者的你还可以接受。 但是&#xff0c;令你头疼的是&#xff0c;随着企业规模的扩大&#xff0c;你…

springboot信息安全技术在投票网站-计算机毕业设计源码12740

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能分析 …

ai自动配音工具

AI拟音大师&#xff0c;给你的无声视频添加生动而且同步的音效 &#x1f61d;文件夹是一种基于文本的视频到音频生成框架,可以生成高质量的音频,在语义上相关,并与输入视频时间同步。 下载地址&#xff1a;https://pan.quark.cn/s/5a2be1cc5551

微服务概述及如何搭建微服务

1. 微服务架构—SpringCloud 1.1 单体应用架构 将项目所有模块【功能】打成jar包或者war包&#xff0c;然后部署一个进程 优点&#xff1a; 部署简单&#xff1a;由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可技术单一&#xff1a;项目不需要复杂的技术栈&am…

windows启动nacos时报Caused by: java.lang.UnsatisfiedLinkErro错误

Caused by: java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\2\librocksdbjni6009210463092880400.dll: Can’t find dependent libraries 因为电脑没有vc&#xff0c;或vc版本问题&#xff0c;下载对应的vc安装就可以了 VC“2015-2022”运行库官…

基础复习(反射、注解、动态代理)

反射 反射&#xff0c;指的是加载类的字节码到内存&#xff0c;并以编程的方法解刨出类中的各个成分&#xff08;成员变量、方法、构造器等&#xff09;。 1.获取类的字节码 &#xff08;3种方式&#xff09; public class Test1Class{public static void main(String[] arg…

全球社区的建立:Facebook在跨文化交流中的角色

在全球化日益加深的今天&#xff0c;跨文化交流成为了人们日常生活中的重要部分。Facebook作为全球最大的社交网络平台之一&#xff0c;正在发挥着越来越重要的作用。通过其广泛的用户基础和丰富的功能&#xff0c;Facebook不仅连接了来自不同国家和地区的人们&#xff0c;也在…

数据迁移数亿小文件该如何做到?

在数字化转型的浪潮中&#xff0c;企业在数据管理上遇到了诸多挑战&#xff0c;尤其是面对海量小文件的数据迁移问题。这类迁移任务不仅复杂&#xff0c;而且对效率、数据一致性和完整性的要求极高。 处理数亿小文件的数据迁移并非易事。当文件数量庞大&#xff0c;尤其是文件大…

吴恩达老师机器学习-ex8

data1 导入库&#xff0c;读取数据并进行可视化 因为这次的数据是mat文件&#xff0c;需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析&#xff0c;发现是字典类型&#xff0c;查看该字典的键&#xff0c;可以发现又X等关键字。 import numpy as np import…

matplotlib库学习之绘图透明度设置(精炼准确)

matplotlib库学习之透明颜色设置 一、简介 在数据可视化中&#xff0c;透明度设置可以使图表更具层次感&#xff0c;特别是在多层叠加图表时。matplotlib库提供了多种方法来设置图表各个部分的透明度&#xff0c;包括图形、文本、图例、坐标轴等部分。 二、为什么要设置成透明…