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

news/2024/9/18 12:51:35/ 标签: 算法

134. 加油站

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int cur=0, total=0, start=0;for(int i=0; i<gas.size(); i++){cur+=gas[i]-cost[i];total+=gas[i]-cost[i];if(cur<0){start=i+1;cur=0;}}if(start>=gas.size())return -1;if(total<0)return -1;return start;   }
};

cur用来累计新的起点下,所有油站的净利, 如果累计到i【首次】出现负值,则符合要求的起点一定在i后面。

反证法:

假设i之前存在一个符合题意的起点j(old_start<j<i),即在[j,i]的累计和为正,又因为[old_start,i]的累计和为负,则[old_start, j]区间内的累计和一定为负,换句话说,累计到小于i的j时,就已经出现了负值,这与i的【首次】性矛盾。

for循环结束后,start指向第一个在其之后累计和为正的位置(因为一旦遇到负就会更新start),此时该累计和表示后半段的盈利额,若全局盈利(total为正),则一定可以覆盖前半段的开支。

135. 分发糖果

class Solution {
public:int candy(vector<int>& ratings) {int n=ratings.size();vector<int> nums(n,1);for(int i=1; i<n; i++){if(ratings[i]>ratings[i-1])nums[i]=nums[i-1]+1;}for(int i=n-2; i>=0; i--){if(ratings[i]>ratings[i+1])nums[i]=max(nums[i],nums[i+1]+1);}return accumulate(nums.begin(),nums.end(),0);}
};

题目要求比相邻大,可以拆解为【比前面大】和【比后面大】两个子问题:

从前往后扫,假定前置元素已经符合要求,解决比前面大的问题;

然后,从后往前扫,假定后置元素已符合,解决比后面大的问题。

860. 柠檬水找零

class Solution {
public:bool lemonadeChange(vector<int>& bills) {unordered_map<int,int> remain;for(auto& bill:bills){remain[bill]++;if(bill==10){remain[5]--;if(remain[5]<0)return false;}else if(bill==20){if(remain[10]>0){remain[10]--;remain[5]--;if(remain[5]<0)return false;}else{remain[5]-=3;if(remain[5]<0)return false;}}}return true;}
};

贪心思想,遇到20的bill,优先使用10块找零,5块是最灵活的,省着用。

406. 根据身高重建队列

class Solution {
public:static bool cmp(vector<int>& a, vector<int>& b){if(a[0]==b[0])return a[1]<b[1];return a[0]>b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);list<vector<int>> result;for(auto& p:people){int idx=p[1];auto it=result.begin();for(int i=0; i<idx; i++)it++;result.insert(it,p);}return vector<vector<int>>(result.begin(),result.end());}
};

需要频繁插入元素使用了list数据结构,根据身高降序排列后依次处理,考虑一个新的元素p(当前最小),根据要求的索引idx,直接插入指定位置,该操作的合理性:

1.list里元素都是大于p的,自然有idx之前的也大于p,即p这个元素是合理的。

2.考虑插入p后,p之前的元素,因为相对顺序较插入前没有变化,所以保持合理。

3.考虑插入p后,p之后的元素,虽然相较插入前有整体的后移,但是由于p是最小的,而idx记录的是大于元素的个数,因此p不会产生贡献,即idx不需要变化,因此也是合理的。


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

相关文章

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…

Vue3+TS项目给el-button统一封装一个点击后转圈效果的钩子函数按钮防抖

前言 每个按钮都要单独定义一个loading变量&#xff0c;并且在接口请求前修改为true&#xff0c;接口响应后再修改为false&#xff0c;封装后这段重复的逻辑就可以统一管理不用每次都写一遍了。 效果 新建一个公共的src\common.ts import { ref } from "vue"expor…

【有啥问啥】探索扫地机器人中的 SLAM 算法:原理、实现与未来展望

探索扫地机器人中的 SLAM 算法&#xff1a;原理、实现与未来展望 随着智能家居的普及&#xff0c;扫地机器人逐渐成为日常生活中的常见家电。其自主导航能力使得它能够在复杂的家庭环境中高效完成清洁任务&#xff0c;而这背后的核心技术之一就是 SLAM&#xff08;Simultaneou…

git的快速合并fast-forward merge详解

文章目录 1. 什么是快进合并&#xff1f;2. 快进合并的前提条件3. 快进合并的工作原理3.1 示例场景&#xff1a;3.2 使用命令&#xff1a;3.3 快进合并的视觉效果&#xff1a; 4. 快进合并的优点5. 快进合并的缺点6. 快进合并 vs 非快进合并6.1 非快进合并&#xff1a;6.2 非快…

【Linux】ps -ef 与 ps aux 的区别及 “|” “grep” 的详解

前言&#xff1a;虽然 ps -ef 与 ps aux 命令都能查看进程运行情况&#xff0c;但两者之间还是有一些细致区别。 一、格式与输出 1、ps -ef/ps -Af&#xff1a; -e是显示所有进程&#xff0c;包括其他用户的进程。-A属于-e别名&#xff0c;功能相同。 -f &#xff1a;显示更…

Android TextView 学习备忘

1.android:gravity 与 android:layout_gravity&#xff1a; Android TextView文本位置_mob649e8166858d的技术博客_51CTO博客https://blog.51cto.com/u_16175509/8597723 2.设置字体样式&#xff1a; android:fontFamily"font/my_custom_font"android:textStyle&qu…

Android SystemUI组件(05)状态栏-系统状态图标显示管理

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注下方 SystemBars分析中状态栏中的部分-系统状态图标显示&管理 即可。 1 系统状态图标显…