代码随想录打卡Day29
今天的题目尊嘟好难…除了第三题没看视频,其他的题目都是看了视频才做出来的。二刷等我。
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;}
};
好难啊。。今天这个博客是我写的篇幅最大的博客之一了。
相关文章:
代码随想录打卡Day29
今天的题目尊嘟好难…除了第三题没看视频,其他的题目都是看了视频才做出来的。二刷等我。 134. 加油站 感觉这道题和之前的53. 最大子序和有点像,最大子序和是一旦当前总和为负数则立即抛弃当前的总和,从下个位置重新开始计算,而…...
图分类!!!
deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…...
高防IP是如何防御攻击
DDoS攻击作为网络攻击中最常见的一种,一般利用大量的虚假流量向目标服务器发起攻击,进而堵塞网络损耗服务器性能,使服务器呈现崩溃状态,令真正的用户无法正常访问发送请求。以前的大型企业通常都是使用高防服务器来抵抗这类攻击&a…...
Kubernetes 系列 | k8s入门运维
目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…...
yolov8+deepsort+botsort+bytetrack车辆检测和测速系统
结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术,可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统(ITS)等领域,能够实时识别并跟踪车辆,并估算其速度。 项目介绍 本项目旨在开发…...
基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现
文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进和局限3. 源码和发行版 概要 准静态自适应环形缓存器(Quasi-Static Adaptive Ring Cache)是task…...
C++笔记---指针常量和常量指针
巧记方法(方法来自于网络出处忘记了):const读作常量,*读作指针,按顺序读即可。例如: const int * ptr; //const在前*在后读作常量指针 const * int ptr; //const在前*在后读作常量指针 int * const prt; /…...
Python习题 177:设计银行账户类并实现存取款功能
(编码题)Python 实现一个简单的银行账户类 BankAccount,包含初始化方法、存款、取款、获取余额等功能。 参考答案 分析需求如下。 Python 类 BankAccount,用于模拟银行账户的基本功能。该类应包含以下方法: 初始化方法: 接受两个参数:account_holder(账户持有人的姓…...
IPhone 16:它的 “苹果智能 “包括哪些内容?
IPhone 16 的发布让科技界看到了该公司的人工智能产品 “苹果智能”(Apple Intelligence)究竟能做些什么。 苹果公司发布了拥有人工智能硬件升级的最新款 iPhone 16,进一步进军人工智能领域。苹果公司首席执行官蒂姆-库克(Tim Coo…...
【中国国际航空-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
【ArcGIS】栅格计算器原理及案例介绍
ArcGIS:栅格计算器原理及案例介绍 栅格计算器(Raster Calculator)原理介绍案例案例1:计算栅格数据平均值 参考 栅格计算器(Raster Calculator)原理介绍 描述:在类似计算器的界面中,…...
LOOKUP函数和VLOOKUP函数知识讲解与案例演示
〇、需求 在 Excel 文档中,根据查找值从查找域和结果域构成的数组中,找到对应的结果值。 一、知识点讲解 LOOKUP函数(比较常用,推荐)和VLOOKUP函数 两个公式都可以实现上述需求。 1. LOOKUP 函数 1.1 单个查询条件…...
Java技术深度探索:高并发场景下的线程安全与性能优化
Java技术深度探索:高并发场景下的线程安全与性能优化 在当今的软件开发领域,随着互联网应用的日益复杂和用户量的激增,高并发成为了一个不可忽视的技术挑战。Java,作为一门广泛应用于企业级开发的编程语言,其内置的并发支持机制如线程(Thread)、锁(Lock)、并发集合(…...
Vulnhub-RickdiculouslyEasy靶场(9个flag)
flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口,发现一些敏感文件 访问80端口,没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…...
Android Studio Menu制作
文章目录 在Activity上新建onCreateOptionsMenu新建menu目录及资源文件新建Menu一级菜单在Activity上加载Menu 在Activity上新建onCreateOptionsMenu Overridepublic boolean onCreateOptionsMenu(Menu menu) {return super.onCreateOptionsMenu(menu);}新建menu目录及资源文件…...
【mybatis】使用模糊查询时报错:Encountered unexpected token: “?“ “?“
报错信息如下: Mapper.xml报错代码: AND HILIST_NAME like %#{hilistName}% 解决方案: 把模糊查询的 sql 语句改为使用 CONCAT 命令拼接, 就不会报错了。 AND HILIST_NAME like CONCAT(%, #{hilistName},%)...
【Linux】文件权限与类型全解:你的文件安全指南
欢迎来到 CILMY23 的博客 🏆本篇主题为:文件权限与类型全解:你的文件安全指南 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题…...
解析DNS查询报文,探索DNS工作原理
目录 1. 用 tcpdump工具监听抓包 2. 用 host 工具获取域名对应的IP地址 3. 分析DNS以太网查询数据帧 3.1 linux下查询DNS服务器IP地址 3.2 DNS以太网查询数据帧 (1)数据链路层 (2)网络层 (3)传输层…...
Unity让摄像机跟随物体的方法(不借助父子关系)
在Unity中,不使用子对象的方式让相机跟随物体移动,我们通过编写脚本来实现。下面放一个从工程中摘出来的的C#脚本示例,用于将相机绑定到一个Target对象上并跟随其移动: using UnityEngine; public class FollowCamera : MonoBeh…...
misc音频隐写
一、MP3隐写 (1)题解:下载附件之后是一个mp3的音频文件;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密;mp3stego工具是音频数据分析与隐写工具 (2)mp3stego工具的使用:…...
保姆级教程:手把手教你为Jetson Orin Nano刷入R36.4.4系统(从下载到开机)
从零开始:Jetson Orin Nano开发者套件系统刷入全流程实战指南 当你第一次拿到NVIDIA Jetson Orin Nano开发者套件时,那种兴奋感可能很快会被"我该如何开始"的困惑所取代。这款性能强大的边缘计算设备确实令人着迷,但如果没有正确的…...
微信小程序获取手机号登录,从免费到收费后,我的低成本替代方案(附完整代码)
微信小程序登录策略优化:从手机号收费到低成本用户体系设计 去年微信团队调整了小程序获取用户手机号的规则——从完全免费变为1000次调用后的按量计费。这对于日活超过1000的中小开发者来说,意味着每月可能新增数百至数千元的额外成本。但用户登录又是小…...
本地部署开源推送通知系统 ntfy 并实现外部访问
ntfy 是一款简单、轻量级且功能强大的开源推送通知系统,它的核心目标是让用户或开发者能够轻松地从任何设备、任何地方向自己的手机或桌面发送通知。本文将详细介绍如何在 Linux 系统局域网内部署 ntfy 并结合路由侠实现外网访问局域网内部署的 ntfy 。 第一步&…...
从科研到工程:为什么我选择用ROS2重构Apollo/autoware的规控算法?
从科研到工程:为什么我选择用ROS2重构Apollo/autoware的规控算法? 在自动驾驶领域,从实验室原型到量产系统的跨越,往往伴随着技术栈的全面升级。三年前,当我第一次将Apollo的规划控制模块移植到ROS1环境时,…...
【数字信号调制】GMSK调制解调系统【含Matlab源码 15239期】
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…...
OpenClaw技能市场探索:GLM-4.7-Flash加持的10个实用插件
OpenClaw技能市场探索:GLM-4.7-Flash加持的10个实用插件 1. 为什么需要关注OpenClaw技能市场? 当我第一次接触OpenClaw时,最让我惊喜的不是它的基础功能,而是它丰富的技能市场生态。作为一个长期使用各类自动化工具的技术爱好者…...
学习记录:数据预处理流程全解析
学习记录:数据预处理流程全解析 在大数据分析过程中,数据预处理是极为关键的环节,它直接影响到后续分析结果的准确性和可靠性。近期深入学习了数据预处理的各个流程,包括数据清洗、数据集成、数据变换和数据归约,下面将…...
别再死记硬背公式了!图解OpenCV相机标定:从像素到世界的坐标变换到底在干啥?
图解OpenCV相机标定:从像素到世界的坐标变换全解析 当你第一次看到相机标定的数学公式时,是不是感觉像在看天书?旋转矩阵、平移向量、内参矩阵...这些抽象的概念到底对应着现实世界中的什么?本文将用最直观的方式,带你…...
告别996!用Google Antigravity的Agent-First模式,5分钟搞定React Native与Android原生桥接模块
告别996!用Google Antigravity的Agent-First模式,5分钟搞定React Native与Android原生桥接模块 如果你是一位长期奋战在Android与React Native混合开发一线的工程师,一定对"桥接模块"这个词汇又爱又恨。每当产品经理提出"我们…...
APK Studio安全最佳实践:合规使用逆向工程工具
APK Studio安全最佳实践:合规使用逆向工程工具 【免费下载链接】apkstudio Open-source, cross platform Qt based IDE for reverse-engineering Android application packages. 项目地址: https://gitcode.com/gh_mirrors/ap/apkstudio 在移动应用开发与安全…...
