您的位置:首页 > 编程语言

美团点评 2017春招编程题

2017-03-23 22:17 435 查看
编程题有题号,应该是随机抽取的。

题目大意

给定一个数列,求它的最长上升子序列的长度。

思路 - 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的创建和销毁的函数,创建函数中有文件读取,但是没有关闭输入流。只发现了这一个错误。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息