leetcode354. 俄罗斯套娃信封问题(动态规划-java)

news2024/9/20 10:57:04

俄罗斯套娃信封问题

  • leetcode354. 俄罗斯套娃信封问题
    • 题目描述:
    • 解题思路
    • 代码演示
  • 动态规划专题

leetcode354. 俄罗斯套娃信封问题

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/russian-doll-envelopes

题目描述:

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。

示例 1:
输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

示例 2:
输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

提示:
1 <= envelopes.length <= 105
envelopes[i].length == 2
1 <= wi, hi <= 105

解题思路

合法嵌套,是大的套小的,因此这个题就是最长递增子序列的一个变种.当于在二维平面中找一个最长递增的子序列,其长度就是最多能嵌套的信封个数。
递增子序列的解题方法可以查看leetcode300. 最长递增子序列
如何在二维数组中,运用递增子序列的方式.我们就需要现堆这个二维数组处理一下了:
先对宽度 w 进行升序排序,如果遇到 w 相同的情况,则按照高度 h 降序排序;之后把所有的 h 作为一个数组,在这个数组上计算 LIS 的长度就是答案。
用图演示一下,就明白为何能这样做了:
在这里插入图片描述
然后在 h 上寻找最长递增子序列,这个子序列就是最优的嵌套方案:
在这里插入图片描述

代码演示

   public int maxEnvelopes(int[][] envelopes) {
        int N = envelopes.length;  
         Arrays.sort(envelopes, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];
            }
        });

        int[]heights = new int[N];  
        for(int i = 0; i < N; i++){
            heights[i] = envelopes[i][1];    
        }
        return lengthOfLIS(heights);
    }
		
   	/**
   	* 最长递增子序列 可以直接复制进力扣测试
   	*/
    int lengthOfLIS(int[] nums) {
       int N = nums.length;
       //动态规划表
       int[]dp = new int[N];
       for(int i = 0; i < N; i++){
       	//base case 每个位置本身长度
           dp[i] = 1;
           for(int j = 0;j < i; j++){
            // i 位置依次向前比 ,比j 位置大,就是 1 + dp[i]
           // 根据不同j位置上的数,来更新最大值
               if(nums[i] > nums[j]){
                  dp[i] = Math.max(dp[i],1 + dp[j]);  
               }
               
           }
       }
       int res = 0;
         //取出 dp表中的最大值 就是我们要的答案.
       for (int i = 0; i < dp.length;i++){
           res = Math.max(res,dp[i]);
       }
       return res;
    }

上面的lengthOfLIS 这个方法时间复杂度是O(N2) n平方的,时间限制上可能过不去,可以进行下面的二分法改造>

 int lengthOfLIS(int[] nums) {
         int N = nums.length;
         int[]ends = new int[N];
         int count = 0;
         for(int i = 0; i < N ; i++){
            int cur = nums[i];
            int L = 0;
            int R = count;
            while(L < R){
                int mid = (L + R) / 2;
                if(ends[mid] >= cur){
                    R = mid;
                }else{
                    L = mid + 1;
                }
            }
            //
            if(L == count){
                count++;
            }
            ends[L] = cur;
         }
         return count;
     }

动态规划专题

leetcode300. 最长递增子序列

leetcode300. 最长递增子序列

leetcode213. 打家劫舍 II

leetcode337. 打家劫舍 III

leetcode198. 打家劫舍

leetcode174. 地下城游戏

打败怪兽的概率

leetcode688. 骑士在棋盘上的概率

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

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

相关文章

c++学习之模板

目录 一&#xff0c;模板的概述 二&#xff0c;函数模板 1.函数模板的定义 2.函数模板的注意事项 3.函数模板的重载 4.函数模板的局限性 三&#xff0c;类模板 1.类模板的概念 2.类模板定义方式 3.类模板的成员函数在类外实现 4.函数模板作为类模板的友元 5.在写程…

《大学英语4》期末考试复习(一)听力原文+答案速记

目录 Unit 1 Long conversation Passage 1 Unit 2 Long conversation Passage 1 Unit 3 Long conversation Passage 1 Unit 4 Long conversation Passage 1 Unit 5 Long conversation Passage 1 Unit 6 Long conversation Passage 1 Unit 7 Long conversat…

Java线程池小结

目录 一.什么是线程池 二.线程池的好处是什么 三.四种基本线程池及其使用 newCachedThreadPool newFixedThreadPool newScheduledThreadPool newSingleThreadExecutor 线程池的四种拒绝策略 选择一:AbortPolicy 选择二:CallerRunsPolicy 选择三:DiscardPolicy 选择四…

【Java】Java核心要点总结70

文章目录 1. volatile 如何保证变量的可⻅性&#xff1f;2. volatile 可以保证原⼦性么&#xff1f;3. synchronized 关键字4. synchronized 和 volatile 的区别5. synchronized 和 ReentrantLock 的区别 1. volatile 如何保证变量的可⻅性&#xff1f; 在Java中&#xff0c;使…

html实现多种风格的时间轴(附源码)

文章目录 1.设计来源1.1 对称风格时间轴1.2 横向风格时间轴1.3 回忆风格时间轴1.4 记事风格时间轴1.5 简易风格时间轴1.6 科技风格时间轴1.7 列表风格时间轴1.8 跑道风格时间轴1.9 人物风格时间轴1.10 容器风格时间轴1.11 沙滩风格时间轴1.12 双边风格时间轴1.13 图文风格时间轴…

【verilog基础】时钟无毛刺切换电路 Clock Glitch Free

文章目录 一、时钟切换电路:容易产生毛刺二、时钟无毛刺切换电路:在S端增加一些控制通路三、异步时钟无毛刺切换电路:使用同步电路解决亚稳态问题四、真题题目解答一、时钟切换电路:容易产生毛刺 1、在芯片运行时经常需要切换时钟源,通常的实现方式是:通过mux来选择不同的…

用试题这把“剑“帮你破除指针与数组之间的那些猫腻

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《系统解析C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白…

【linux】在Linux系统开机的时候卡在/dev/nvme0n1p1:clean / files / blocks界面进不去

一、问题背景 开机的时候没办法开机&#xff0c;一直停留在下面这个界面。 x86/cpu: SGX disabled by BIOS dev/nvme0n1p3:clean, 21118/30523392 fies, 122066176/122070272 blocks dev/nvme0n1p4:clean, 486125/61038592 fies,21657184/244140544b1ocks 试过网上的一些方法…

Ubuntu20.04+Intel SGX(一):环境安装与测试

文章目录 测试环境一、检查服务器是否支持SGX方法1&#xff1a;cpuid查看是否支持SGX方法2&#xff1a;test-sgx.c测试是否支持SGX验证是否支持SPS 二、启动 SGX 服务参考文档启动 SGX方法1&#xff1a;BIOS 启动SGX方法2&#xff1a;软启动 SGX检查SGX是否开启成功 三、安装 S…

C++在线五子棋对战(网页版)项目:环境搭建

Centos-7.6环境搭建 安装wget工具 wget工具是Linux中的一个下载文件的工具&#xff0c;支持通过 HTTP、HTTPS、FTP 三个最常见的TCP/IP协议 下载&#xff0c;并可以使用 HTTP 代理。可以使用以下命令进行下载&#xff1a; sudo yum install wget 下载后&#xff0c;可以使用以…

【Linux】CentOS7 设定本机当前地区时间为虚拟机时间的简单操作

目录 情景系统环境操作 情景 新安装的虚拟机时间和当前本地系统时间不一致&#xff0c;现在想要将虚拟机和本机地区的时间调节为一致。 系统环境 CentOS Linux 7 系统界面大致如此。 操作 点击虚拟机界面左上角的 Applications 选项&#xff0c; 选择System-Tools-- Sett…

【C++】C++关于异常的学习

文章目录 C语言传统的处理错误的方式一、异常的概念及用法二、自定义异常体系总结 C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 1. 终止程序&#xff0c;如 assert &#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除 0 错误时就会终止…

【Python】元组 创建 访问 切片 拼接 解包

2.3 元组 元组在输出时总是有括号的。 元组在输入时可以没有。 像字符串一样&#xff0c;元组是不可变的。 索引、切片以及一些方法很多与列表相似。 1&#xff09;定义 元组是一种不可变序列&#xff0c;它与列表类似&#xff0c;但元组的元素不能修改。元组中的元素可以是任意…

【Vuejs】1720- 详细聊一聊 Vue3 动态组件

&#x1f449; 「相关文章」 深入浅出 Vue3 自定义指令6 个你必须明白 Vue3 的 ref 和 reactive 问题初中级前端必须掌握的 10 个 Vue 优化技巧分享 15 个 Vue3 全家桶开发的避坑经验 动态组件[1]是 Vue3 中非常重要的一个组件类型&#xff0c;它可以让我们在不同的场景下灵活地…

Git远程仓库使用

说明&#xff1a;使用Git&#xff0c;可以实现版本控制和协作开发。需要协作开发&#xff0c;当然需要建立一个Git代码托管的平台。目前可以使用GitHub、码云、GitLab等&#xff0c;码云相当于国内的GitHub&#xff0c;在国内访问速度高于GitHub&#xff1b;而GitLab是搭建私服…

阿里云服务器的可靠性和稳定性如何?是否有SLA保障?

阿里云服务器的可靠性和稳定性如何&#xff1f;是否有SLA保障&#xff1f;   一、阿里云服务器的可靠性   阿里云服务器作为全球领先的云计算服务平台&#xff0c;以其高性能、高可靠性和高安全性获得了广泛好评。为满足企业客户对稳定、可靠云服务的需求&#xff0c;阿里云…

「译文」用ChatGPT助力SEO工作

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 那些使用ChatGPT的先进人士&#xff0c;也没还能完全掌握它内容生成的能力&#xff0c;特别是像博客那样的长文写作能力。 现在&#xff0c;跟大家介绍 一下SEO优…

GeoServer中使用Qgis发布的SLD样式进行图层美化

目录 知识地图 一、前言 二、Qgis符号化转变成SLD 1、Qis中符号化生成 2、SLD样式导出 三、GeoServer数据发布 1、矢量图层发布 2、在GeoServer中发布样式 总结 知识地图 序号博文链接1使用LeafLet叠加Geoserver wms图层到已有底图的方法2关于GeoServer发布服务时数据源…

windows -- 自动安装python包,并启动服务

文章目录 定制python的包编写批处理文件遇到的问题 自动安装python的包&#xff0c;并启动后台服务进程。 定制python的包 基于python的Flask框架&#xff0c;简单开发一个服务器&#xff1b;编写发布python包的setup.py 在my_ff包的同级目录下创建一个setup.py&#xff0c…

【跟小嘉学 Rust 编程】三、Rust 的基本程序概念

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 文章目录 系列文章目录前言一、变量以及可变性1.1、变量声明语法1.2、不可变变量1.3、未使用变量警告1.4、使用 let mu…