代码随想录打卡Day29

news/2024/9/17 20:45:00/ 标签: 算法, 数据结构, c++

今天的题目尊嘟好难…除了第三题没看视频,其他的题目都是看了视频才做出来的。二刷等我。

134. 加油站

感觉这道题和之前的53. 最大子序和有点像,最大子序和是一旦当前总和为负数则立即抛弃当前的总和,从下个位置重新开始计算,而这道题是一旦遇到当前剩余的燃油小于0,则立马抛弃当前的燃油总和,以下个位置为新起点,当然这道题还需要计算遍历过的所有节点的燃油与损耗之差,万一循环结束current_sum>=0,但是total_sum<0也是不行的,所以在循环结束以后并不是判断current_sum是否大于0,因为有可能出现从0出发到不了第i个节点,从第i + 1个节点遍历到结束时current_sum >= 0,但是剩下的燃油+i节点前面的燃油坚持不到第i个节点的情况,综上,在循环结束以后应该判断total_sum是否大于等于0。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int result = 0;  //记录起始位置int current_sum = 0;  //到达某个站点后剩余的油量int total_sum = 0;   //记录所有能得到的油与消耗量之间的差值for(int i = 0; i < gas.size(); i++){current_sum += (gas[i] - cost[i]);  //执行完这条语句后车子已经到达第i + 1个站点了total_sum += (gas[i] - cost[i]);if(current_sum < 0){result = i + 1;current_sum = 0;}    }if(total_sum < 0) return -1; //已经遍历到末尾了,不可能跑一圈return result;}
};

135. 分发糖果

这道题我思路想到了,先从左往右遍历,处理一遍,再从后往前遍历一遍,再处理一遍,但是我在一些代码细节上没有想清楚,所以老是写不对,就很气。。。首先第一个代码细节是明确两次遍历的处理对象是谁,第一次从左往右遍历应该处理左边的值还是右边的值呢?我这里处理的是右边的值,代码是这么写的

//从左往右遍历(右边比左边大的情况)
for(int i = 1; i < ratings.size(); i++){if(ratings[i] > ratings[i - 1])v[i] = v[i - 1] + 1;
}

第二次遍历从右往左,由于前面遍历处理的是右值,反过来遍历的时候就必须处理左值,为什么?因为如果倒过来遍历还是处理右值的话,相当于做无用功,上一次遍历的时候已经对右值赋值过了,没有必要再用一次循环。处理左值的代码我是这么写的

//从右往左遍历(左边比右边大的情况)
for(int i = ratings.size() - 1; i > 0; i--){if(ratings[i] < ratings[i - 1])v[i - 1] = max(v[i] + 1, v[i - 1]);                
}

第二个细节就是第二次遍历的时候的赋值操作,并不是简单地在旁边的较小值的糖果数上加1就完事了,有可能在第一次遍历的时候已经满足大小关系了,第二遍再处理一遍的话会导致重复处理,糖果一定会多发,所以一定要取赋值过后与之前的值之间的较大值。
这是完整的代码

class Solution {
public:int candy(vector<int>& ratings) {vector<int> v(ratings.size(), 1);//从左往右遍历(右边比左边大的情况)for(int i = 1; i < ratings.size(); i++){if(ratings[i] > ratings[i - 1])v[i] = v[i - 1] + 1;}//从右往左遍历(左边比右边大的情况)for(int i = ratings.size() - 1; i > 0; i--){if(ratings[i] < ratings[i - 1])v[i - 1] = max(v[i] + 1, v[i - 1]);                }return accumulate(v.begin(), v.end(), 0);}
};

860.柠檬水找零

这个比较简单,收5块钱不找零,收10块钱只能找5块的零,收20块的优先用10+5找零,其次再用5+5+5找零,按照这个规则去遍历数组,在钞票数够用的情况下一定可以找零,return true,如果出现钞票不够的情况直接return false。

class Solution {
public:map<int, int> money;bool lemonadeChange(vector<int>& bills) {for(int i = 0; i < bills.size(); i++){if(bills[i] == 5)money[5]++;else if(bills[i] == 10){  if(money[5] == 0) //必须要有5元零钱return false;money[5]--;money[10]++;}else{if(money[5] == 0 || (money[10] * 10 + money[5] * 5 < 15)) //找不起钱return false;if(money[10] > 0){money[10]--;money[5]--;}else money[5] -= 3;}}return true;}
};

406.根据身高重建队列

说是说这个题目和分发糖果的思路很像,但是我还是做不出来┭┮﹏┭┮被自己菜哭了。这道题有两个维度,一个是身高h,一个是前面比本人高的人数k,这道题并不能先选择任意一个维度进行排序,因为先按照k排序过后得到的数组依旧没什么逻辑性,很混乱,但是按照身高降序排列的话能得到一些比较好的性质,那就是后面的元素插到前面时,该元素前面的元素的相对位置无需变动,因为从后面插进来的人身高一定会比前面的人矮,并不会影响前面的人的k值,这个性质就非常好。
这道题的原理想清楚以后还没有那么容易写出来,这个题目还比较考验C++基本功,需要对vector<vector>自定义排序规则,首先按身高进行降序排列,身高相同的则k值小的排前面。第二个就是要将元素插入到指定位置,其余元素相对位置不变,vector并没有现成的函数可以调用,所以要自己手搓一个,这里主要还是用swap函数来实现,当某个元素需要插入到前面时,就将该元素与前一个元素交换位置,如此循环,直到该元素被交换到指定位置。

class Solution {
public:static bool compareVectors(const std::vector<int>& a, const std::vector<int>& b) {  // 按照身高降序排列,若身高相同则k值小的靠前if(a[0] > b[0]) return true;else if(a[0] < b[0]) return false;else return a[1] < b[1];} vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), compareVectors);for(int i = 0; i < people.size(); i++){int j = i;int target = people[i][1];while(j > target){iter_swap(people.begin() + j, people.begin() + j - 1);j--;}}return people;}
};

好难啊。。今天这个博客是我写的篇幅最大的博客之一了。


http://www.ppmy.cn/news/1525114.html

相关文章

深入剖析 MQTT 协议:物联网通信的核心力量

摘要&#xff1a; 本文全面深入地探讨了 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议。详细阐述了 MQTT 协议的起源与发展背景&#xff0c;介绍其基本概念、特点及工作原理。深入分析了 MQTT 的架构组成&#xff0c;包括客户端、代理服务器及主题的作…

HivisionIDPhotos

在服务器Ubuntu22.04系统下&#xff0c;HivisionIDPhotos的部署 一、安装环境&#xff1a;ubuntu基本环境配置1.更新包列表&#xff1a;2. 安装GPU驱动程序3.查看显卡信息4.下载并安装 CUDA 12.3 二、安装miniconda环境1. 下载miniconda32. 安装miniconda33. 打开用户环境编辑页…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

apifox 调试接口问题

解决laravel 表单验证时出现的404。只要是不通过验证就会出现404。主要是调用闭包函数内的fail函数。就会出现404 $request->validate([name>[required,function($attributes,$value,$fail)use ($user){if(!$user){$fail(User not found);}}],]); 调试工具会出现404. 解…

数据库导入

1.在导入数据库之前&#xff0c;需要数据库存在&#xff0c;才能导入数据&#xff0c;如果不存在需要创建同名的数据库&#xff1a; 创建数据库命令&#xff1a;sudo mysql -u root -p123456 -e CREATE DATABASE public_database; "public_database" :为数据库名称。…

代码随想录训练营第29天|控制变量

134. 加油站 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int cur0, total0, start0;for(int i0; i<gas.size(); i){curgas[i]-cost[i];totalgas[i]-cost[i];if(cur<0){starti1;cur0;}}if(start>gas…

UDP协议对比普通协议有什么优势

在网络通信中&#xff0c;传输控制协议&#xff08;TCP&#xff09;和用户数据报协议&#xff08;UDP&#xff09;是两种最常用的传输层协议&#xff0c;它们在数据传输中扮演着不同的角色&#xff0c;适用于不同的场景。TCP以其可靠性和顺序传输著称&#xff0c;而UDP则以速度…

【Kubernetes】常见面试题汇总(七)

目录 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; 21.简述 Kubernetes 中 Pod 的重启策略&#xff1f; 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; Kubernetes 中创建一个 Pod 涉及多个组件之间联动&#xff0c;主要流程如下&#xff1a; &#…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人正运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 按D-H方法建立操作臂运动学方程。建立PUMA560机器人运动学方程的步骤如下࿱

利用熵权法进行数值评分计算——算法过程

1、概述 在软件系统中&#xff0c;研发人员常常遇上需要对系统内的某种行为/模型进行评分的情况。例如根据系统的各种漏洞情况对系统安全性进行评分、根据业务员最近操作系统的情况对业务员工作状态进行打分等等。显然研发人员了解一种或者几种标准评分算法是非常有利于开展研…

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息&#xff0c;然后展示在页面上。 效果展示 首次发送需要…

软件设计师の第三章:数据库技术基础

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral

作者主页&#xff1a; https://yuheng.ink/ 论文标题&#xff1a; Pyramid Diffusion for Fine 3D Large Scene Generation 导读&#xff1a; 本文通过设计一种新颖的金字塔扩散模型&#xff0c;为三维室外场景生成提供了一种从粗到细的策略。本文对金字塔扩散模型进行了大量实…

系统设计文档示例

设计文档示例 文章目录 设计文档示例一、整体架构二、业务或功能-模块设计2.1、需求说明2.2、交互流程2.3、页面设计2.4、功能实现逻辑2.4.1 API设计2.4.2 DB设计 三、 配置说明四、开发示例 一、整体架构 系统架构图简要说明部署架构图简要说明功能模块图简要说明技术架构:前…

Reactive 编程-Loom 项目(虚拟线程)

Reactive 编程与 Loom 项目&#xff08;虚拟线程&#xff09; Java 项目 Loom 是 Oracle 在 JVM 上的一项重大变革&#xff0c;旨在引入 虚拟线程&#xff08;Virtual Threads&#xff09;&#xff0c;以简化并发编程。传统的 Java 线程是重量级的&#xff0c;由操作系统管理&…

深入解析C++单例模式:从基础到线程安全的高效实现

引言 在C开发中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09; 是一种常见且重要的设计模式。它确保类的实例在整个程序生命周期中唯一&#xff0c;并提供一个全局访问点。这在日志管理、配置管理等场景中尤为常见。本篇博客将带你深入了解单例模式的实现原理…

单例模式的总结

常规模式:有属性/构造方法/普通方法&#xff0c;也可以在类中执行主方法&#xff0c;也可以在test类中执行主方法 单例模式是什么&#xff1f; 单例模式&#xff1a;类只有1个对象&#xff1b;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。单例模式是在内…

uniapp uni-table合并单元格

视图层 <uni-table border stripe emptyText"暂无更多数据" class"table_x"><!-- 表头行 --><uni-tr><uni-th align"center">患者姓名</uni-th><uni-th align"center">透析方式</uni-th>&…

常用设计模式的通俗解释和c语言实现

单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问点。 通俗解释:想象一个公司只能有一个CEO。无论你如何尝试创建新的CEO,你总是会得到同一个人。 #include <stdio.h> #include <stdlib.h>typedef struct {int data; } Singleton;static Singleton* i…

设计模式 23 访问者模式

设计模式 23 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…