力扣(俄罗斯套娃信封问题)

devtools/2024/9/30 0:26:42/

354. 俄罗斯套娃信封问题

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

思路:

首先,需要同时有宽和高都大于才能包含,因此同一时间需要比较两方面的数字,因此需要先固定其中一种数字,这样只需要对另一种数字进行比较,这里选择按照宽度由小到大排列,这样对于i位置和i+1位置,只要i+1位置高度大于i位置高度,则两者一定可以包含在一起。

其次,此时在宽度排序的情况下,就是寻找按照顺序递增顺序所能包含的最大的数,即从中按照顺序选择一些数,使得满足递增排序。但是有一点不同的是,可能有宽度一样的存在,此时哪怕高度高也不能放到一块,因此宽度必须满足大于才行,因此对于宽度相同的数,如果按照高度递减排序,这样就一定不会出现宽度相同而高度由小到大的情况,在这种情况下直接找递增序列就可以了。

找递增序列的方法就是利用一个有序数组记录当前递增序列的一部分记录,对于进去的一个高度,如果比数组中最大的元素都大,说明一定可以包含进去,则数组尾插该高度。若不能比最大元素都大,则利用二分法找到一个位置i,满足i-1位置小于该高度,i位置大于等于该高度,然后更新i下标的数为该高度即可。

最后返回的就是有序数组的高度。

class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) {
//    //选择一种合适的顺序,将尽可能多的放在一块
//    sort(envelopes.begin(),envelopes.end());
//    int n=envelopes.size();
//    vector<int>dp(n,1);//    for(int i=n-2;i>=0;i--)
//    {
//      //n的平方
//      int m=1;
//      for(int j=i+1;j<n;j++)
//      {
//         if(envelopes[i][0]<envelopes[j][0]&&envelopes[i][1]<envelopes[j][1])
//         {
//             m=max(dp[j]+1,m);
//         }
//      }
//      dp[i]=m;//    }
//     int ret=dp[0];
//     for(auto e:dp)
//     {
//         ret=max(e,ret);
//     }
//     return ret;  //最后超时的做法,原因是每次找高大于且数字大的需要n的时间auto cmp=[&](vector<int>&p1,vector<int>&p2){ if(p1[0]<p2[0]) return true; else if(p1[0]>p2[0]) return false ;else return p1[1]>p2[1];};sort(envelopes.begin(),envelopes.end(),cmp);int n=envelopes.size();vector<int>count;for(int i=0;i<envelopes.size();i++){//二分查找对应位置int l=0,r=count.size()-1;if(count.size()==0||count.back()<envelopes[i][1])count.push_back(envelopes[i][1]);else{while(l<r){int mid=(l+r)/2;if(count[mid]>envelopes[i][1]){r=mid;}else if(count[mid]<envelopes[i][1]){l=mid+1;}else{   l=mid;break;}}count[l]=envelopes[i][1];}}return count.size();}
};


http://www.ppmy.cn/devtools/104945.html

相关文章

js处理echarts tooltip定时轮播

echarts tooltip定时轮播 /*** echarts tooltip轮播* param chart ECharts实例* param chartOption echarts的配置信息* param options object 选项* {* interval 轮播时间间隔&#xff0c;单位毫秒&#xff0c;默认为3000* true表示循环所有series的tooltip…

MySQL——事务与存储过程(一)事务管理(1)事务的概念

事务处理机制在程序开发过程中有着非常重要的作用&#xff0c;它可以使整个系统更加安全&#xff0c;保证在同一个事务中的操作具有同步性。 现实生活中&#xff0c;人们经常会进行转账操作&#xff0c;转账可以分为两部分来完成&#xff0c;转人和转出&#xff0c;只有这两个部…

Mybatis链路分析:JDK动态代理和责任链模式的应用

背景 此前写过关于代理模式的文章&#xff0c;参考&#xff1a;代理模式 动态代理功能&#xff1a;生成一个Proxy代理类&#xff0c;Proxy代理类实现了业务接口&#xff0c;而通过调用Proxy代理类实现的业务接口&#xff0c;实际上会触发代理类的invoke增强处理方法。 责任链功…

BOOTSTRAP VUE快速使用

步骤 1&#xff1a;安装 Bootstrap npm install bootstrap步骤 2&#xff1a;导入 Bootstrap import bootstrap使用组件 <buttoon type button classbtn btn-primary>

OpenCV 模板匹配教程

OpenCV 模板匹配教程 模板匹配是一种计算机视觉技术&#xff0c;用于在更大的图像&#xff08;源图像&#xff09;中查找较小的子图像&#xff08;模板图像&#xff09;。OpenCV 提供了多种模板匹配的方法&#xff0c;允许我们检测源图像中与模板最相似的位置。在本教程中&…

【3.6】贪心算法-解救生艇问题

一、题目 第 i 个人的体重为 people[i]&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit 。 返回载到每一个人所需的最小船数。(保证每个人都能被船载)。 二、解题思路 题目要求每艘船最多能载两人&…

单窗口IP代理设置指南:轻松搞定

在现代互联网生活中&#xff0c;IP代理已经成为了许多人日常上网的必备工具。单窗口IP代理是一种非常实用的代理方式&#xff0c;它允许你在同一个浏览器中为不同的窗口设置不同的IP地址&#xff0c;从而更好地保护隐私和实现多任务处理。今天&#xff0c;我们就来详细讲解一下…

AI引领,驱动未来:零售企业的新质生产力革命

在这个快节奏的零售世界里&#xff0c;每一天都充满了变数。但你是否想象过&#xff0c;当AI&#xff08;人工智能&#xff09;、驱动技术、商品计划软件以及新质生产力携手并进时&#xff0c;零售企业将如何焕发新生&#xff0c;轻松应对挑战&#xff0c;引领行业潮流&#xf…