分享下头条第一题解法,同时求问第四题这类题该如何做

第四题,找Ai>=x ,Bi>=y
这种不是至少要遍历一遍序列吗,大数据量的时候如何优化内存和运行时间?

vector < int > indexOfLIDS( vector < int >nums) {

vector < int >res( 2 ,- 1 );

if (nums. size ()<= 2 ){

res[ 0 ]=- 1 ;

res[ 1 ]=- 1 ;

} else {

vector < int >dpDecrease(nums. size (), 1 ); // 序列到当前位的最长递减子串长度

vector < int >dpIncrease(nums. size (), 1 ); // 序列到当前位的最长递增子串长度

for ( int i= 1 ;i<nums. size ();++i){

if (nums[ i ]<nums[ i - 1 ]){

dpDecrease[ i ] = dpDecrease[ i - 1 ]+ 1 ;

dpIncrease[ i ] = 1 ;

} else {

dpIncrease[ i ] = dpIncrease[ i - 1 ]+ 1 ;

dpDecrease[ i ] = 1 ;

}

}

vector < int >len(nums. size (), 0 ); // 序列到当前位的最长 先上升后下降 区间长度

int max = 1 ;

int left = - 1 ,right=- 1 ;

for ( int i= 0 ;i<nums. size ();++i){

if (dpDecrease[ i ]== 1 ){

len[ i ]= 0 ;

} else {

int j = i - dpDecrease[ i ] + 1 ;

if (dpIncrease[ j ] == 1 ){

len[ i ] = 0 ;

} else {

len[ i ] = dpDecrease[ i ]+dpIncrease[ j ]- 1 ;

if (max<len[ i ]){

max = len[ i ];

left = j - dpIncrease[ j ]+ 1 ;

right = i;

}

}

}

}

res[ 0 ] = left;

res[ 1 ] = right;

}

return res;

}

#字节跳动#
全部评论
从左到右遍历一次,求最长上升字串,从右到左也算一次,求相加最大者。
点赞 回复 分享
发布于 2017-03-30 21:18
只ac了这一个题...其他的都是50以下
点赞 回复 分享
发布于 2017-03-30 21:18
请问,你输入输出怎么写的?
点赞 回复 分享
发布于 2017-03-30 21:20
暴力求解,先找出宽度最长的,在找到对应下标,再求左右区间
点赞 回复 分享
发布于 2017-03-30 21:24
感觉第四题应该是要2次排序吧。。。
点赞 回复 分享
发布于 2017-03-30 21:39
第四题应该考的是离线存储优化类型的问题,然而第三题花掉了一小时。。。
点赞 回复 分享
发布于 2017-03-30 21:48
离线,输入结构体和请求结构体都按降序排列。对于每个请求,将符合x的输入结构体的b加入数状数组或线段树,求y的数状数组和。复杂度nlogn。
点赞 回复 分享
发布于 2017-03-30 23:29

相关推荐

11-29 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
无情咸鱼王的秋招日记之薛定谔的Offer:R
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务