【动态规划】程序员面试金典——11.7叠罗汉I

程序员面试金典: 9.11 排序与查找 11.6叠罗汉问题-------动态规划 #include #include #include #include using namespace std; /* 问题:有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一个人的肩膀上。出于实际和美观的考虑,在 上面的人要比下面的人矮一点、轻一点。已知马戏团每个人的高度和重量,请编写代码计算叠罗汉最多 能叠几个人。 分析:这不是之前“推箱子”的题目吗。之前是用递 阅读详情

程序员面试金典——11.7叠罗汉I

首先我来批判一下这个题目出的真是不咋滴,后来的人按理说应该在上面。但此题的意思是求最长递增子序列,即后来的人在下面,完全是为了出题而出题。。。
参考博客:
[1]https://blog.youkuaiyun.com/sjt19910311/article/details/51439614
[2]https://blog.youkuaiyun.com/sjt19910311/article/details/50544908
Solution1:动态规划,复杂度 O(n2) O ( n 2 ) 。
复杂度非最优,但思想易于理解且代码简练。
res[i]表示必须以i 元素结尾的最长递增子序列的长度, 如何得出这个长度呢?
res[i]等于men[0,…,i - 1]中比men[i]小的元素对应的dp值 + 1

class Stack {
public:
    int getHeight(vector<int> men, int n) {
        // write code here
        vector<int> dp(n,1);
        int ret = 0;
        for(int i = 1;i<n;++i) {
            for(int j = 0;j<i;++j) {
                if(men[j] < men[i])
                    dp[i] = max(dp[j] + 1,dp[i]);
            }
            ret = max(ret,dp[i]);
        }
        return ret;
    }
};

Solution2:利用二分查找,把时间复杂度降至 O(nlogn) O ( n l o g n )
维护一个单调序列,遍历nums数组,二分查找每一个数在单调序列中的位置,然后替换之。
具体而言:http://www.cnblogs.com/grandyang/p/4938187.html(LeetCode300,此链接内有详细解法)
我们来看一种思路更清晰的二分查找法,跟上面那种方法很类似,思路是先建立一个空的dp数组,然后开始遍历原数组,对于每一个遍历到的数字,我们用二分查找法在dp数组找第一个不小于它的数字,如果这个数字不存在,那么直接在dp数组后面加上遍历到的数字,如果存在,则将这个数字更新为当前遍历到的数字,最后返回dp数字的长度即可,注意的是,跟上面的方法一样,特别注意的是dp数组的值可能不是一个真实的LIS。参见代码如下:

class Stack {
public:
    int getHeight(vector<int> men, int n) {
        // write code here
        vector<int> dp;
        for(int i = 0; i < men.size(); ++i) {
            int low = 0, high = dp.size();
            while(low < high) {
                int mid = (low + high) / 2;
                if(dp[mid] < men[i]) //最终循环退出的条件是low == high,且dp[low]是第一个>=men[i]的数字
                    low = mid +1;
                else 
                    high = mid;
            }
            if(low >= dp.size())
                dp.push_back(men[i]);  
            else  
                dp[low] = men[i];  
        }
        return dp.size();  
    }
};
程序员面试题集锦 谷歌面试官经典作品(CTCI)目录 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数之和 阅读详情

相关推荐

TLS回调函数–一文看懂(详)

TLS回调函数 CTF RE

Joyce_hjll的博客 3718

leetcode 叠罗汉 面试题17.06

有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。 示例: 输入: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) 来源:力扣(Le

weixin_45485072的博客 657

全志T113 Tina5.0开发:(零)源码下载&修改调试串口

本文章主要作为自己的笔记,如有错误欢迎指出$ repo start product-da-t113-tina-stable --all # 全部下载完成之后,创建分支运行过程可能会出现版本问题;rm -rf .repo //先删除试试( 我安装的是3.6版本)

u014428915的博客 1164

leetcode —— 面试题 17.08. 马戏团人塔

有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。 示例: 输入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110] 输出:6 解释:从上往下数,叠罗汉最多能叠 6 层:(56,90),...

然后就去远行 707

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南

本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。

weixin_29279153的博客 731

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导

标准高斯过程回归从零开始公式推导

qq_43587949的博客 1万+

程序员面试金典(动态规划):叠罗汉问题_最长递增子序列(java解法)

题目描述: 叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。同时我们应该让上面的人比下面的人更高一点。已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人。注意这里的人都是先后到的,意味着参加游戏的人的先后顺序与原序列中的顺序应该一致。 给定一个int数组men,代表依次来的每个人的身高。同时给定总人数n,请返回做多能叠的人数。保证

qiaoqiao0609的博客 5284

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2727

【leetcode】面试题 17.08. 马戏团人塔

按照身高升序,相同身高的按照体重降序进行排序后,就变成了最长升序子序列(LIS)问题。 class Solution { public int bestSeqAtIndex(int[] height, int[] weight) { int len = height.length; int[][]person = new int[len][2]; for(int i = 0; i < len;i++){ person[i]

838

DSP篇--C6678功能调试系列之EDMA3调试

EDMA主要用于数据的搬运,发送、接收,其搬运数据的形式有;AB模式,ABC模式以及ping-pong模式。 EDMA3分初始化、参数配置、以及中断配置。其中中断配置则需要注意的内容主要有:挂载的TC通道,对应的触发事件,以及中断的使能。

nanke_yh的博客 1720

STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与以W5500通信,驱动以太网模块。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): W5500以太网模块 这里我使用常见的以太网模块W5500: W5500官网 http://www.w5500.cn/ W5500中文手册 iEthernet W5500 Datasheet 软件准备 需要安装好Keil - MDK及芯片对应的包,以

Mculover666的博客(嵌入式) 7387

程序员面试金典目录

转:程序员面试金典-快课网 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数之和

Roykuang的专栏 756

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1616

程序员面试金典——11.7叠罗汉II

程序员面试金典——11.7叠罗汉II Solution1:动态规划,复杂度O(n2)O(n2)O(n^2)。 复杂度非最优,但思想易于理解且代码简练。 res[i]表示必须以i 元素结尾的最长递增子序列的长度, 如何得出这个长度呢? res[i]等于men[0,…,i - 1]中比men[i]小的元素对应的dp值 + 1 这也是在叠罗汉I中的solution1的思路 class ...

Allenlzcoder的博客 503

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

cracking the coding interview 中文版 (程序员面试金典)

 转自:CTCI面试系列——谷歌面试官经典作品 | 快课网 谷歌面试官经典作品(CTCI)目录 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2

hackerzchao 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

程序员面试问题资源经验

一、基础 原文《crack the code interview》,出资谷歌自身面试官之手,下面是中文译文。 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.4 写一个函数判断两个字符串是否是变位词 1.5 写一个函数,把字符串中所有的空格替换为%20 1.6 矩阵旋转 1.7 矩阵行列置0 1.8 利用已知函数判断字符串是否为另一字...

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 686

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

程序员面试资源搜集

本文将程序员面试相关的资源全部搜集汇总,方便各位网友随时查看。 资源一:《crack the code interview》——谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网补充。 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是

快课 490

程序员面试资源大收集

原文链接:http://www.cricode.com/3282.html 资源一:《crack the code interview》——谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充。 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1

小白成长记录 1140

程序员面试资源集锦

资源一:《crack the code interview》——谷歌资深技术面试官经典之作本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充。1.1 判断一个字符串中的字符是否唯一1.2 字符串翻转1.3 去除字符串中重复字符1.8 利用已知函数判断字符串是否为另一字符串的子串2.1 从链表中移除重复结点2.2 实现一个算法从一个单链...

weixin_33859665的博客 124

经典算法题:谷歌面试经典题目

谷歌面试官经典作品(CTCI)目录 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数之和 2.5 给定一个循环链表,

我的专栏 9995

程序员面试资源大收集(转)

资源一:《crack the code interview》——谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充。 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一...

weixin_34146986的博客 85
上一篇: 程序员面试金典——11.6矩阵元素查找
下一篇: 程序员面试金典——11.7叠罗汉II
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值