面试题 17.08. 马戏团人塔

news/2025/2/19 17:02:02/

题目链接

面试题 17.08. 马戏团人塔 mid

题目描述

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

示例:

输入: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)

提示:
  • h e i g h t . l e n g t h = w e i g h t . l e n g t h ≤ 10000 height.length = weight.length \leq 10000 height.length=weight.length10000

解法:排序 + 二分 + 贪心

先按 h e i g h t height height 升序排序,当身高相同时,再按 w e i g h t weight weight 降序排序。

比如 [ 2 , 6 ] , [ 2 , 5 ] , [ 2 , 7 ] , [ 1 , 4 ] , [ 3 , 8 ] [2,6],[2,5],[2,7],[1,4],[3,8] [2,6],[2,5],[2,7],[1,4],[3,8] 排序之后就变为 [ 1 , 4 ] , [ 2 , 7 ] , [ 2 , 6 ] , [ 2 , 5 ] , [ 3 , 8 ] [1,4],[2,7],[2,6],[2,5],[3,8] [1,4],[2,7],[2,6],[2,5],[3,8]

接着我们按照第二维,即 w e i g h t weight weight { 4 , 7 , 6 , 5 , 8 } \{4,7,6,5,8\} {4,7,6,5,8},求 最长上升子序列 的长度。

最长上升子序列为 { 4 , 5 , 8 } \{ 4,5,8\} {4,5,8},即 [ 1 , 4 ] , [ 2 , 5 ] , [ 3 , 8 ] [1,4],[2,5],[3,8] [1,4],[2,5],[3,8],叠罗汉最多叠 3 3 3 个人。

最长上升子序列解法

由于 n = 1 0 4 n = 10^4 n=104,我们直接使用动态规划的时间复杂度为 O ( n 2 ) O(n^2) O(n2),会超时。

会超时的代码:

using PII = pair<int,int>;class Solution {
public:int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {int n = height.size();vector<PII> a;for(int i = 0;i < n;i++){auto h = height[i] , w = weight[i];a.emplace_back(h,w);}sort(a.begin(),a.end(),[&](auto &p,auto &q){if(p.first == q.first) return p.second > q.second;return p.first < q.first;});int ans = 0;vector<int> f(n);for(int i = 0;i < n;i++){f[i] = 1;for(int j = 0;j < i;j++){if(a[i].second > a[j].second) f[i] = max(f[i],f[j] + 1);}ans = max(ans , f[i]);}return ans;}
};

在这里插入图片描述
最长子序列,我们可以使用二分来优化,将时间复杂度优化为 O ( n × l o g n ) O(n \times logn) O(n×logn),能够通过本题。

时间复杂度: O ( n × l o g n ) O(n \times logn) O(n×logn)

C++代码:

using PII = pair<int,int>;class Solution {
public:int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {int n = height.size();vector<PII> a;for(int i = 0;i < n;i++){auto h = height[i] , w = weight[i];a.emplace_back(h,w);}sort(a.begin(),a.end(),[&](auto &p,auto &q){if(p.first == q.first) return p.second > q.second;return p.first < q.first;});int ans = 0;vector<int> f;for(int i = 0;i < n;i++){if(f.size() == 0 || a[i].second > f.back()) f.push_back(a[i].second);else{auto it = lower_bound(f.begin(),f.end(),a[i].second);*it = a[i].second;}}return f.size();}
};

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

相关文章

Rust踩雷笔记(7)——两个链表题例子初识裸指针

目录 leetcode 234leetcode 19 leetcode 234 题目在这https://leetcode.cn/problems/palindrome-linked-list/&#xff0c;leetcode 234的回文链表&#xff0c;思路很简单&#xff0c;就是fast和slow两个指针&#xff0c;fast一次移动两个、slow一次一个&#xff0c;最后slow指…

企业蓄电池怎么实时监测?这个方法最简单使用!

在这个数字时代&#xff0c;企业对电力的依赖性愈发显著&#xff0c;这使得电池系统成为维持业务连续性的不可或缺的一环。 蓄电池监控不仅有助于实时跟踪电池系统的性能和状态&#xff0c;还有助于预测问题&#xff0c;提前采取措施以防止电力中断。它还可以帮助企业降低能源成…

leetcode646. 最长数对链(java)

最长数对链 题目描述贪心解法二 动态规划 dp 题目描述 难度 - 中等 leetcode646. 最长数对链(java) 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅…

成都瀚网科技有限公司:抖店平台买家怎么修改评价?

在抖音电商平台上&#xff0c;买家的评价对店铺的声誉和销售业绩有着重要影响。然而&#xff0c;有时买家可能会因为某些原因想要修改之前的评价。那么&#xff0c;抖店平台上的买家如何修改评价呢&#xff1f;修改评价对店铺有什么影响&#xff1f;本文将介绍买家如何修改评价…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于AUTOSAR架构的AT控制系统研究与实现

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 AUTOSAR规范及开发流程

科技资讯|Canalys发布全球可穿戴腕带设备报告,智能可穿戴增长将持续

市场调查机构 Canalys 近日发布报告&#xff0c;表示 2023 年第 2 季度全球可穿戴腕带设备出货量达 4400 万台&#xff0c;同比增长了 6%。 主要归功于其亲民的价格以及消费者对价位较高的替代品仍持谨慎态度&#xff0c;基础手环市场尽管与去年同期相比有所下降&#xff0c;…

SpringBoot+若依+图片导出

前言 本文基于若依框架&#xff0c;实现excel中图片导出功能。 自定义导出Excel数据注解 public enum ColumnType{NUMERIC(0), STRING(1), IMAGE(2);private final int value;ColumnType(int value){this.value value;}public int value(){return this.value;}} 工具类中设置…

蓝桥杯打卡Day12

文章目录 接龙数列冶炼金属 一、接龙数列OJ链接 本题思路:本题是一道经典的dp问题&#xff0c;设第i个数的首位数字是first&#xff0c; 末位数字是last。因为第i个数只可能加到一个以first结尾的接龙数列中使得这个接龙数列长度加1并且结尾数字变成last.所以状态转移方程为d…