美团点评 2017春招编程题
2017-03-23 22:17
435 查看
编程题有题号,应该是随机抽取的。
全部做完后,发现还有半个小时,就开始想O(nlogn)的解法,虽然已经忘了具体怎么写,但是记得在处理的过程中,以上升子序列的长度为下标,上升子序列的最后一个数为值(长度相同,取较小值),就能构造出一个单调递增的数组,然后就能用二分找到最后一个数小于当前数的最长上升子序列的长度。
熟练后就不需要dp数组了
美团点评还有道读程序题,给了一个Activity的创建和销毁的函数,创建函数中有文件读取,但是没有关闭输入流。只发现了这一个错误。。。
题目大意
给定一个数列,求它的最长上升子序列的长度。思路 - DP
很简单的DP,先做的编程题,就先赶快写了个O(n2)的解法便去做前面的题了。设dp[i]表示以第i个数为结尾的最长上升子序列的长度,状态转移方程为:dp[i]=max(dp[j])+1,j<i&&num[j]<num[i]全部做完后,发现还有半个小时,就开始想O(nlogn)的解法,虽然已经忘了具体怎么写,但是记得在处理的过程中,以上升子序列的长度为下标,上升子序列的最后一个数为值(长度相同,取较小值),就能构造出一个单调递增的数组,然后就能用二分找到最后一个数小于当前数的最长上升子序列的长度。
熟练后就不需要dp数组了
代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n, num, l, r, mid, mx; int mn[100003];//mn[i]表示长度为i的上升子序列中,最后一个数的最小值 int main() { while(1 == scanf("%d", &n)) { mx = 0; memset(mn, 0x3f, sizeof(mn)); while(n-- > 0) { scanf("%d", &num); l = 1; r = mx; while(l <= r) { mid = (l + r) >> 1; if(mn[mid] < num) { l = mid + 1; } else { r = mid - 1; } } mn[r + 1] = min(mn[r + 1], num); mx = max(mx, r + 1); } printf("%d\n", mx); } return 0; }
美团点评还有道读程序题,给了一个Activity的创建和销毁的函数,创建函数中有文件读取,但是没有关闭输入流。只发现了这一个错误。。。
相关文章推荐
- 题解-美团点评2017秋招笔试编程题
- [编程题] 最长公共连续子串(美团点评2017秋招)
- 美团点评2017秋招笔试编程题第2题
- 美团点评2017秋招笔试编程题 - 题解
- [编程题] 大富翁游戏(美团点评2017秋招)
- [编程题] 拼凑钱币(美团点评2017秋招)
- 美团点评2017校园招聘编程题--取红包
- 美团点评2017秋招笔试编程题第3题
- [编程题] 最大矩形面积(美团点评2017秋招)
- 美团点评2017秋招笔试真题-运维工程师B
- 美团点评2018春招后台开发方向编程题 - 题解
- 美团点评笔试编程题——图的闭包
- 算法面试题-美团点评2016研发工程师编程题(二)-字符编码(哈夫曼树)
- 美团点评编程题
- 美团点评秋招编程题
- 美团点评2017年秋招笔试编程题
- 美团点评2017秋招笔试真题A
- 2018美团点评春招C++试卷编程题
- 2017校招 美团笔试题 编程题 层次遍历多叉树
- 美团点评2016研发工程师编程题(二)题解