LeetCode高频题:客栈选择问题,总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚

本文主要是介绍LeetCode高频题:客栈选择问题,总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode高频题:客栈选择问题,总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
在这里插入图片描述


文章目录

  • LeetCode高频题:客栈选择问题,总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚
    • @[TOC](文章目录)
  • 题目
  • 一、审题
  • 上述原文连接的解决方案
  • 小根堆贪心解决
    • Cx2如何求?x中任选2个组合
    • 包装color和p为一个节点Node,然后准备小根堆的比较器
    • OK,解决输入npk,然后手撕代码,小根堆弹出节点,统计组合数量
  • 还有一个尴尬的问题,上面我那个做法呀,因为排序漏掉了一个情况,比如5 2 7,其实住宿方案选择57,中间还有2可以喝咖啡,这个组合我没有算
  • 总结

题目

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示) ,且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈) ,且咖啡店的最低消费不超过 p。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。
————————————————
版权声明:本文为CSDN博主「流浪德意志」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/li4692625/article/details/121585585


一、审题

输入

第一行三个整数 n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
接下来的 n行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。

输出

输出只有一行,一个整数,表示可选的住宿方案的总数。

样例输入

5 2 3
0 5
1 3
0 2
1 4
1 5

样例输出

3

提示

2 人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤,
但是若选择住 4、5 号客栈的话,4、5 号客栈之间的咖啡店的最低消费是 4,而两人能承受的最低消费是 3 元,所以不满足要求。因此只有前 3 种方案可选。

【数据范围】
对于 30%的数据,有 n ≤ 100;
对于 50%的数据,有 n ≤ 1,000;
对于 100%的数据,有 2 ≤ n≤ 200,000,0 < k ≤ 50,0 ≤ p ≤ 100, 0 ≤ 最低消费 ≤ 100。


上述原文连接的解决方案

怎么做的,我觉得没写特别清楚,有兴趣你去看看,代码c++的
代码很简单,但是精简,往往不是超级高手难以理解

下面我自己想一个好理解的方案

小根堆贪心解决

将每一行给你的color和p集合成一个客栈节点Node
把color和最低消费p整个为一个节点node,

然后整体放入小根堆自动排序,规则:color不同按照color升序,color相同的,按照p升序
在这里插入图片描述
然后遍历i=0–k-1每一个颜色

对于同一个色调i,先统计小根堆弹出的最低消费pi<=p的有几个x,然后看最低消费pi>p的弹出几个y?
那么i色调中组合方案就是x*y种

你想想是不是?
在这里插入图片描述
上图,对于0色调i来说,pi<=p=3的x=3种,也就是我们可以去这三家消费
而pi>p=3的就y=2种,我们只能从可以住的,与这些消费不起的店组合,即3*2=6种

对了,哈哈哈哈,在x种任选2家也是可以的!!!!!!!

ans=6+C3,2=6+3=9种
在这里插入图片描述
算法嘛就是在整理思路的过程中优化的!

好,我们整理一下,手撕代码:

Cx2如何求?x中任选2个组合

在这里插入图片描述

        //求组合CX2,好说//Ck2=k!/2!*(k-2)!  == k*(k-1)*(k-2)!/2*(k-2)!=k*(k-1)/2public static int Ck2(int k){if (k == 0 || k == 1) return 0;//如果k<2那不好意思,没得玩return k*(k - 1) >> 1;}

包装color和p为一个节点Node,然后准备小根堆的比较器

        //包装color和p节点public static class Node{public int color;public int p;public Node(int c, int pp){color = c;p = pp;}}//比较器——专门用来让小根堆按照规则排序的public static class colorComparator implements Comparator<Node>{@Overridepublic int compare(Node o1, Node o2){return o1.color == o2.color ? o1.p - o2.p : o1.color - o2.color;//color相同按p升序,不同按color升序}}

OK,解决输入npk,然后手撕代码,小根堆弹出节点,统计组合数量

        public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int[] nkp = new int[3];for (int i = 0; i < 3; i++) {nkp[i] = in.nextInt();}int n = nkp[0];int k = nkp[1];int p = nkp[2];//接下来n行,俩数PriorityQueue<Node> heap = new PriorityQueue<>(new colorComparator());for (int i = 0; i < n; i++) {int[] cp = new int[2];for (int j = 0; j < 2; j++) {cp[j] = in.nextInt();//读color和p}heap.add(new Node(cp[0], cp[1]));//加入堆}int ans = 0;//结果//然后开始处理统计每种颜色i=0--k-1上有啥情况for (int i = 0; i < k; i++) {int x = 0;//pi<=p的节点数量int y = 0;//pi>p的节点数量while (!heap.isEmpty() && heap.peek().color == i){//同一个色调弹出Node cur = heap.poll();if (cur.p <= p) x++;else y++;//2进1}//色调不同了,OK,统计ans += Ck2(x) + x * y;}//色调全部统计OKSystem.out.println(ans);}

测试:

5 2 3
0 5
1 3
0 2
1 4
1 5
3

完全OK
思路明确
可惜考试的时候,很紧张,没想出来招,尴尬,考试就是这样
慢慢想可能很好解决
但是临场考试,真的很难想到解决方案!!!
慢慢练习吧,见多识广!

还有一个尴尬的问题,上面我那个做法呀,因为排序漏掉了一个情况,比如5 2 7,其实住宿方案选择57,中间还有2可以喝咖啡,这个组合我没有算

在这里插入图片描述
这个问题是因为我认为排序导致的顺序问题

我们这样改进,把node再加一个因素:index,原始的客栈的位置

我们在弹出pi>p的时候,看看已经弹出x中,是否有一个在y的任意俩客栈间
这样的话,可以组合俩y

我们试试代码:

        public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int[] nkp = new int[3];for (int i = 0; i < 3; i++) {nkp[i] = in.nextInt();}int n = nkp[0];int k = nkp[1];int p = nkp[2];//接下来n行,俩数PriorityQueue<Node> heap = new PriorityQueue<>(new colorComparator());for (int i = 0; i < n; i++) {int[] cp = new int[2];for (int j = 0; j < 2; j++) {cp[j] = in.nextInt();//读color和p}heap.add(new Node(cp[0], cp[1], i));//加入堆,位置也标记}int ans = 0;//结果//然后开始处理统计每种颜色i=0--k-1上有啥情况for (int i = 0; i < k; i++) {int x = 0;//pi<=p的节点数量int y = 0;//pi>p的节点数量List<Integer> xHeap = new ArrayList<>();List<Integer> yHeap = new ArrayList<>();while (!heap.isEmpty() && heap.peek().color == i){//同一个色调弹出Node cur = heap.poll();if (cur.p <= p){x++;xHeap.add(cur.index);}else{y++;//2进1yHeap.add(cur.index);}}//色调不同了,OK,统计ans += Ck2(x) + x * y;//别忘了加俩y中一个x,那种合法的for(Integer index : xHeap){//挨个对比,看看有没有for (int j = 0; j < yHeap.size(); j++) {for (int l = j + 1; l < yHeap.size(); l++) {//枚举所有j l不同,看看是否满足同时夹住indexif ((yHeap.get(j) < index && index < yHeap.get(l)) ||(yHeap.get(l) < index && index < yHeap.get(j))) ans++;}}}}//色调全部统计OKSystem.out.println(ans);}//包装color和p节点public static class Node{public int color;public int p;public int index;public Node(int c, int pp, int i){color = c;p = pp;index = i;}}

测试一把;

3 1 3
0 5
0 2
0 5

这次OK了
上面2 5,2 5, 5 5 都行的
就是复杂度高了点感觉

3 1 3
0 5
0 2
0 5
3

结果是OK的

但是还得想想别的办法


总结

提示:重要经验:

1)客栈问题是很经典的题目,贪心,然后统计可以组合的方案
2)贪心的题目就是小根堆加排序解决的,老油条了
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

这篇关于LeetCode高频题:客栈选择问题,总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418980

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验