代码随想录算法训练营第35天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

柠檬水找零

Alt
局部最优:收到20元时优先找零10元+5元,不够再找零3个5元,因为5元可以找零20和10,更有用。全局最优:完成所有的找零。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0;
        for(int i = 0; i < bills.size(); i++){
            if(bills[i] == 5){
                five++;
            }
            else if(bills[i] == 10){
                if(five){
                    ten++;
                    five--;
                }
                else  return false;
            }
            else{
                if(ten && five){
                    ten--;
                    five--;
                }
                else if(five >= 3){
                    five -= 3;
                }
                else  return false;
            }
        }
        return true;
    }
};

根据身高重建队列

Alt
贪心问题中如果不遇到保持原有顺序或者原来顺序有意义的情况,一般都是需要对输入重新排序的,这样方便设计贪心策略。这道题也是一开始需要对原数组进行排序。
原数组有两个维度,从分发糖果那道题中我们可以获得经验,这种有两个维度的问题,可以先满足一个维度的条件,再考虑另外一个维度。我们把原数组按身高从大到小排序,保证前面的人肯定是比后面的人高,身高相同则k小的站在前面。可以设计贪心策略为:
优先按身高高的人的k值插入结果数组中,这样一定可以满足他前面始终有k个人的身高都大于等于下标k位置的人。

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		if(a[0] != b[0])  return a[0] > b[0];
		else  return a[1] < b[1];   // 优先比较身高,身高从大到小,身高相同则将k小的放前面
	}
public:
	vector<vector<int>> reconstructQueue(vector<vector<int>>& people){
		sort(people.begin(), people.end(), cmp);
		vector<vector<int>> que;
		for(int i = 0; i < people.size(); i++){
			int index = people[i][1];
			que.insert(que.begin() + index, people[i]);
		}
		return que;
	}
};

这个算法的时间复杂度表面看应该是 O(nlogn + n^2),因为insert的时间复杂度为 O(n)。但是在C++底层实现中,vector构建的动态数组之所以能随意添加元素,是因为它的扩容机制。当插入元素导致当前的数组容量不够时,会开辟一个是原来容量二倍的新数组空间,将现在的数组拷贝过去,再将原数组从内存中释放。这样其实时间复杂度变成了 O(n^2 + t * n),t 就是拷贝的次数。
所以我们可以考虑用链表实现insert的过程。

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		if(a[0] != b[0])  return a[0] > b[0];
		else  return a[1] < b[1];
	}
public:
	vector<vector<int>> reconstructQueue(vector<vector<int>>& people){
		sort(people.begin(), people.end(), cmp);
		list<vector<int>> que;
		for(int i = 0; i < people.size(); i++){
			int index = people[i][1];
			std::list<vector<int>>::iterator it = que.begin();
			while(index--){
				it++;
			}
			que.insert(it, people[i]);
		}
		return vector<vector<int>>(que.begin(), que.end());
	}
};

用最少数量的箭引爆气球

Alt
如果气球重叠了,那么重叠的这一组气球的最小右边界位置一定需要一支箭,才能一箭射爆这一组重叠气球。这个逻辑有不同的实现方式,我们可以先对气球的右边界从小到大进行排序,每次射击优先射击最小的右边界,同时跳过已经被射爆的气球。
Alt

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		return a[1] < b[1];
	}
public:
	int findMinArrowShots(vector<vector<int>>& points){
		sort(points.begin(), points.end(), cmp);
		int shot = points[0][1];
		int result = 1;
		for(int i = 0; i < points.size(); i++){
			if(points[i][0] > shot){  // 该气球没被射爆,同时有最小的右边界
				shot = points[i][1];
				result++;
			}
		}
		return result;
	}
};

也可以按气球的左边界排序,通过遍历排序好的气球维护当前重叠气球的最小右边界,一旦出现左边界大于右边界的气球,说明该气球不与上一组气球重叠,另外需要一支箭,以此类推。

class Solution{
static bool cmp(vector<int>& a, vector<int>& b){
		return a[0] < b[0];
	}
public:
	int findMinArrowShots(vector<vector<int>>& points){
		sort(points.begin(), points.end(), cmp);
		int result = 1;  // 有气球至少需要一支箭
		for(int i = 1; i < points.size(); i++){
			if(points[i][0] > points[i - 1][1]){
				result++;
			}
			else{
				points[i][1] = min(points[i - 1][1], points[i][1]);  //更新当前的最小右边界
			}
		}
		return result;
	}
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】

RocksDB是Flink中用于持久化状态的默认后端&#xff0c;它提供了高性能和可靠的状态存储。然而&#xff0c;当处理大型状态并频繁读写时&#xff0c;可能会导致背压问题&#xff0c;因为RocksDB需要从磁盘读取和写入数据&#xff0c;而这可能成为瓶颈。 遇到的问题 Flink开发…

多线程编程3——线程的状态

一、状态是线程的状态 状态是PCB中与调度相关的属性&#xff0c;线程是CPU调度执行的基本单位。所以&#xff0c;状态是线程的属性。谈到状态&#xff0c;考虑的都是线程的状态&#xff0c;不是进程&#xff01;&#xff01;&#xff01; 二、在Java中&#xff0c;线程的状态…

作业车间调度问题:P还是NP

获取更多资讯&#xff0c;赶快关注上面的公众号吧&#xff01; 文章目录 基本概念多项式时间指数时间 P问题&#xff08;多项式问题&#xff09;NP问题&#xff08;非确定性多项式问题&#xff09;暴力穷举法动态规划 P与NP关系&#xff1a;作业车间调度问题是典型的NP难问题 …

将vite项目(vue/react)使用vite-plugin-pwa配置为pwa应用,只需要3分钟即可

将项目配置为pwa模式&#xff0c;就可以在浏览器里面看到安装应用的选项&#xff0c;并且可以将web网页像app一样添加到手机桌面或者pad桌面上&#xff0c;或者是电脑桌面上&#xff0c;这样带来的体验就像真的在一个app上运行一样。为了实现这个目的&#xff0c;我们可以为vue…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

vite+vue3+ts项目上线docker 配置反向代理API

这次重点的坑是反向代理。 1。项目中配置代理&#xff0c;为了跨域请求数据 项目根目录中新建vite.config.ts文件 在文件中添加配置代理 注意&#xff1a;其中 /api 和target 的地址后面没有 / 2。在项目根目录中新建Httprequest.ts文件&#xff0c;引入axios&#xff0c;并…

网诺安全文件上传总结

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

VUE使用computed实现子父组件双向绑定数据

上面字符串文字是父级的数据&#xff0c;下面表单是父级传给子组件并实现双向绑定 // 这里是vue3写法&#xff0c;vue2 同样在computed里写 get(){} 即可 const form computed({get(){ // props.modelForm 就是父级传过来的对象const proxy new Proxy(props.modelForm,{get(t…

网络原理——传输层2

1.TCP协议 TCP协议是工作中最常用到的协议。 TCP协议格式&#xff1a; 源端口号&#xff08;16位&#xff09;&#xff1a;源端口标识发送方的应用程序。目的端口号&#xff08;16位&#xff09;&#xff1a;目的端口标识接收方的应用程序。序列号&#xff08;32位&#xf…

echarts 堆叠柱状图数据差值较大,导致显示图形差异很大

问题描述&#xff1a; echarts 堆叠柱状图数据差值较大&#xff0c;导致显示图形差异很大 如图&#xff1a; 解决方案 柱状图、折线图 给 y轴或者x轴type设置log 就可以 。饼图 设置 minAngle

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

RX-8564 LC实时时钟模块

.内置 32.768 kHz 晶体单元(频率精度调整完毕) .接口类型&#xff1a;I2C-Bus 接口 (400 kHz) .工作电压范围&#xff1a;1.8 V ~ 5.5 V .计时&#xff08;保持&#xff09;电压范围 &#xff1a;1.0 V ~ 5.5 V / -20 ˚C ~70 ˚C .低待机电流 &#xff1a;275 nA / 3.0…

基于BiLSTM-CRF对清华语料文本进行分类

安装TorchCRF !pip install TorchCRF1.0.6 构建BiLSTM-CRF # encoding:utf-8import torch import torch.nn as nn from TorchCRF import CRFfrom torch.utils.data import Dataset from sklearn.model_selection import train_test_split import numpy as npimport torch im…

python-自动化篇-运维-语音识别

文章目录 理论文本转换为语音使用 pyttsx使用 SAPI使用 SpeechLib 语音转换为文本 代码和效果01使用pyttsx实现文本_语音02使用SAPI实现文本_语音03使用SpeechLib实现文本_语音04使用PocketSphinx实现语音转换文本 理论 语音识别技术&#xff0c;也被称为自动语音识别&#xf…

Threejs 展示——点击模型指定部分添加高亮显示

文章目录 需求分析需求 如下图所示,点击模型指定部分添加高亮显示 分析 绘制一个 canvas将该 canvas 将渲染器挂载到dom<template><canvas id="three" /> </template><scr

基于C#制作一个俄罗斯方块小游戏

目录 引言游戏背景介绍游戏规则游戏设计与实现开发环境与工具游戏界面设计游戏逻辑实现游戏优化和测试性能优化测试工具和流程说明引言 俄罗斯方块是一款经典的益智游戏,深受玩家喜爱。本文将介绍如何使用C#编程语言制作一个简单的俄罗斯方块小游戏,并探讨其设计与实现过程。…

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息

我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话&#xff0c;要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中&#xff0c;其中我们更深入地研究了与遣返相关的成本和节省&#xff0c;以便您更轻松地进行自己的分析。…

递归、分治

递归 Recursion 函数自身调用自身通过函数体来进行的循环以自相似的方法重复进行的过程递归的三个关键 定义需要递归的问题&#xff08;重叠子问题&#xff09;- 数学归纳法思维确定递归边界保护与还原现场 递归形式时间复杂度规模问题举例指数型 2 n 2^n 2n子集排列型 n ! …

基于BERT模型实现文本相似度计算

配置所需的包 !pip install transformers2.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install HanziConv -i https://pypi.tuna.tsinghua.edu.cn/simple 数据预处理 # -*- coding: utf-8 -*-from torch.utils.data import Dataset from hanziconv import Han…