LeetCode——354.俄罗斯套娃信封问题(困难)【LIS & 二分】

23 篇文章 0 订阅
10 篇文章 0 订阅

在这里插入图片描述


题解

  • w按照升序排序之后,对于h求LIS即可
  • 注意排序时,w相同的,要按照h降序排序。这样可以防止w相同,求h的lis出现违法情况

class Solution { // 手写二分
public:
   int maxEnvelopes(vector<vector<int>>& envelopes) {
		sort(envelopes.begin(), envelopes.end(), [](const vector<int>& a, const vector<int>& b) {
			if (a[0] != b[0])	return a[0] < b[0];
			else return a[1] > b[1];
		});
		// b存储小于当前env[1]的最大h
		vector<int> b(envelopes.size() + 1, 0);
		int len = 0;
		for (vector<int>& env : envelopes) {
			if (env[1] > b[len]) {
				b[++len] = env[1];
			}
			else {
				int low = 0, high = len;
				while (low < high) {
					int mid = low + (high - low) / 2;
					if (env[1] <= b[mid])	high = mid;
					else  low = mid+1;
				}
				b[low] = env[1];
			}
		}
		return len;
	}
};


class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        int n = envelopes.size();
        sort(envelopes.begin(), envelopes.end(), [](const vector<int>& a, const vector<int>& b){
            if(a[0] != b[0])    return a[0] < b[0];
            else    return a[1] > b[1]; 
        });
        vector<int> dp(n + 1);
        int len = 0;
        dp[1] = envelopes[0][1];
        for(vector<int> e : envelopes) {
            if(e[1] > dp[len]) {
                dp[++len] = e[1];
            }
            else {
                int p = lower_bound(dp.begin() + 1, dp.begin() + len + 1, e[1]) - dp.begin();
                dp[p] = e[1];
            }
        }
        return len;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值