程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 超时解
      • 2.2 二分查找

1. 题目

有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点
已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人

示例:
输入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110]
输出:6
解释:从上往下数,叠罗汉最多能叠 6 层:(56,90), (60,95), (65,100), (68,110), (70,150), (75,190)提示:
height.length == weight.length <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/circus-tower-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:
LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
程序员面试金典 - 面试题 08.13. 堆箱子(DP)

2.1 超时解

  • 类似于最大上升子序
  • 采用DP解法,时间复杂度 O(n2)O(n^2)O(n2),看上面数据规模,超时妥妥的 ( 23 / 43 个通过测试用例 )
class Solution {
public:int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {int i, j, n = height.size(),maxP = 1;vector<vector<int>> p(n);for(i = 0; i < n; ++i)p[i] = {height[i], weight[i]};sort(p.begin(),p.end());//按身高升序vector<int> dp(n,1);for(i = 1; i < n; ++i){for(j = i-1; j >= 0; --j){if(p[i][1] > p[j][1]){dp[i] = max(dp[i], 1+dp[j]);maxP = max(maxP, dp[i]);}}}sort(p.begin(),p.end(),[&](auto a, auto b){return a[1] < b[1];});//按体重升序vector<int> dp1(n,1);for(i = 1; i < n; ++i){for(j = i-1; j >= 0; --j){if(p[i][0] > p[j][0]){dp1[i] = max(dp1[i], 1+dp1[j]);maxP = max(maxP, dp1[i]);}}}return maxP;}
};

2.2 二分查找

  • 思路:对一个变量排序,第一个变量相等的时候,第二个变量降序排列(一会求第二个变量的最长上升子序,避免第一个变量相等也取进去)
  • 然后dp[i] 表示长度为 i 的上升子序的 序列最后一个数的最小值(采用二分查找,找到第一个大于等于 target 的)
class Solution {
public:int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {int i, idx=0, n = height.size();vector<pair<int,int>> p(n);for(i = 0; i < n; ++i)p[i] = {height[i], weight[i]};sort(p.begin(),p.end(),[](auto a, auto b){if(a.first==b.first)return a.second > b.second;//升高一样,降序,避免选择上升子序时把他们同时选上return a.first < b.first;});//按身高升序vector<int> dp(n);for(i = 0; i < n; ++i){auto it = lower_bound(dp.begin(),dp.begin()+idx,p[i].second);//二分查找求体重的最长上升子序*it = p[i].second;if(it-dp.begin()==idx)idx++;}return idx;}
};

404 ms 46.3 MB

  • 自己编写二分查找
class Solution {
public:int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {int i, j, len=1, n = height.size();vector<pair<int,int>> p(n);for(i = 0; i < n; ++i)p[i] = {height[i], weight[i]};sort(p.begin(),p.end(),[](auto a, auto b){if(a.first==b.first)return a.second > b.second;//升高一样,降序,避免选择上升子序时把他们同时选上return a.first < b.first;});//按身高升序vector<int> dp(n);dp[0] = p[0].second;for(i = 1; i < n; ++i){j = bs(dp,0,len-1,len,p[i].second);//二分查找求体重的最长上升子序dp[j] = p[i].second;if(j == len)len++;}return len;}int bs(vector<int>& dp, int l, int r, int len, int target){   //第一个 大于等于 我的int mid;while(l <= r){mid = l+((r-l)>>1);if(dp[mid] >= target){if(mid==0 || dp[mid-1] < target)return mid;elser = mid-1;}else// if(dp[mid] < target)l = mid+1;}return len;//没有找打,说明它是最大的}
};

264 ms 46.5 MB

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海洋分享lol皮肤插件_LOL战斗之夜客户端BUG频出服务器爆满!如何提前领取皮肤?...

Hello大家好&#xff0c;我是Taker&#xff01;昨天的战斗之夜&#xff0c;小编可是单排奋战了一整晚~排位段位和箱子积分都定格在了钻石&#xff0c;不知道各位如何呢&#xff1f;(^o^)/~今天终于到了收获的日子了&#xff01;之前我们打的积分所获得的皮肤箱子今天就可以打开…

socket异步处理问题

由于一个项目要和第三方软件做接口&#xff0c;第三方软件是Unix的操作系统&#xff0c;所以用了Socket来传输数据。具体结构是这样的&#xff1a;本项目作为服务器端&#xff0c;第三方软件是客户端&#xff0c;并且有多个客户端。通常情况下&#xff0c;要开多个线程来处理多…

2022爆火的AIGC,能给AI续命吗

文 | 陈彩娴源 | AI科技评论生产力如已成熟&#xff0c;想象力还会远吗&#xff1f;“你们是从什么时候开始注意到人类的&#xff1f;”“当第一个原始人开始仰望星空的时候。”AI 的类人猿&#xff0c;早已开始仰望人类。来自机器的审视在过去短短的两年间&#xff0c;算法从业…

LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

1. 题目 给定一些标记了宽度和高度的信封&#xff0c;宽度和高度以整数对形式 (w, h) 出现。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”…

python语言语句块标记是_Python的基本语法——语句块

1.语句块是在条件为真&#xff08;条件语句&#xff09;时执行或者执行多次&#xff08;循环语句&#xff09;的一组语句&#xff1b; 2在代码前放置空格来缩进语句即可创建语句块&#xff0c;语句块中的每行必须是同样的缩进量&#xff1b; 3.缩进&#xff1a;Python开发者有意…

[导入]设计模式初学者系列-工厂方法

摘要: 闲谈工厂方法 设计模式系列到了第四篇了&#xff0c;如果还不谈谈工厂方法设计模式就太对不起GoF了&#xff0c;为什么有如此一说&#xff1f;实际上工厂方法模式是好些模式的基石&#xff0c;她们或多或少的使用了工厂方法模式或以工厂方法为模型。 工厂方法模式是一种类…

推荐一个好发论文的研究方向

今天给大家推荐一个研究的好方向—— 图神经网络。它是近些年学术界和工业界最新的研究热点&#xff01;在社交网络、知识图谱、推荐系统等工业界有广阔的应用前景。最重要的是&#xff0c;图神经网络与CV和NLP交叉&#xff0c;容易有创新点&#xff0c;是出论文的好方向。对于…

LeetCode 31. 下一个排列(线性扫描)

1. 题目 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

Google工作10年的职场感悟

源&#xff5c;电子发烧友网、程序厨哈喽大家好&#xff0c;今天坐地铁读到了一位在 Google 工作10年的“老”工程师关于技术、管理和职场生涯的感悟。我看完后觉得很有收获&#xff0c;因此在这里也分享给大家。以下是全文&#xff0c;后文中的「我」均指「原作者」。我在 Goo…

博客堂joycode被黑掉了

博客堂现在用ie7已经打不开了&#xff0c;用telnet www.joycode.com 80 链接&#xff0c;链接成功之后输入大写的命令 GET / 然后连续两次回车&#xff0c;就可以看到第一行的木马代码<iframe src?????? width20 height0 frameborder0></iframe>。访问其中任…

python的注释符_Python3 注释和运算符

Python3 注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释&#xff1a; Python中单行注释以 # 开头&#xff0c;例如&#xff1a;&#xff1a; #这是一个注释 print("Hello, World!") 多行注释用三个单引号 或者三个双引号…

程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)

文章目录1. 题目2. 解题2.1 STL2.2 线性扫描2.3 位运算1. 题目 下一个数。给定一个正整数&#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数&#xff08;一个略大&#xff0c;一个略小&#xff09;。 例1:输入&#xff1a;num 2&#xff08;或者0b10&am…

同花顺如何切换k线_K线之形态学:浅谈纸白银产品该如何去做好交易?

K线之形态学&#xff1a;浅谈纸白银产品该如何去做好交易&#xff1f;由于疫情期间&#xff0c;明显感觉到今年做投资理财的朋友多了&#xff0c;特别是银行的纸产品&#xff0c;我是分析外盘伦敦银伦敦金为主&#xff0c;自己也是只操作外盘产品。国内的不管是纸白银或者TD白银…

从NeurIPS论文来看,中美学者很少互相引用

源&#xff5c;机器之心想要改变这种情况还很难。不知从何时起&#xff0c;我们习惯了人工智能的学术顶会上中美研究数量排名前两位的形势。不论在工业还是学术上&#xff0c;两者很大程度上引领了技术的发展&#xff0c;中美的交流也非常密切&#xff1a;不少大厂都会在对面设…

[导入][导入][c#]Web开发中Tag的开发技巧

http://onewww.net/blog/article.asp?id87网站开发常用关键字(tag)&#xff0c;一般需要获得最多的被采用的Tag&#xff0c;也就是流行词。通常思路是将关键字tag保存到单独表中&#xff0c;然后在其他表中根据一组id进行对多个关键字进行标识。因为一个文章可以选择多个tag&a…

泰坦尼克号生存预测入门

文章目录1. 数据预览2. 特征初步选择3. 增加特征Sex和Embarked4. 选择随机森林调参5. 实践总结本文作为学习记录&#xff0c;参考 此处&#xff0c;如有侵权&#xff0c;联系删除。1. 数据预览 数据集下载 import pandas as pd import numpy as np from pandas import Series…

excel去重_数据处理之EXCEL的高效技巧分享

这是一个技巧贴&#xff0c;直接上干货&#xff1a;1、你想在excel中看到函数值是如何计算出来的&#xff1f;Ctrl~&#xff1a;进入函数视图2、去除重复值方式有哪些?a、数据—数据工具—删除重复值(以当前选定区域排序&#xff1a;只对选中区域去重&#xff1b;扩展选定区域…

泄露了 5.33 亿 Facebook 用户的个人资料后,Meta 被罚款 2.75 亿美元

文 | 兔子酱编 | 王思若大家好&#xff0c;我是兔子酱。多年前&#xff0c;Facebook曾被曝出一个大瓜——2018 年 5 月至 2019 年 9 月期间&#xff0c;不法分子利用 Facebook 的安全漏洞从 5.33 亿人的个人资料中窃取个人信息&#xff0c;包括电话号码、位置、电子邮件地址、生…

10月24日 多云

10月24号 多云 最近不知怎么了 突然很没有食欲 不到半夜不知道饿。 中午下楼吃饭&#xff0c;走了半天也不知道想吃什么&#xff0c;索性走进了一个菜市场&#xff0c;买了一个鸡架&#xff0c;打道回府。哦对了&#xff0c;路上还买了几个苹果&#xff0c;牙总出血&#xff0c…

程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**

1. 题目 从左向右遍历一个数组&#xff0c;通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉树&#xff0c;输出所有可能生成此树的数组。 示例: 给定如下二叉树2/ \1 3 返回:[[2,1,3],[2,3,1] ]来源&#xff1a;力扣&#xff08…