您的位置:首页 > 其它

leetcode 300. 最长上升子序列 354. 俄罗斯套娃信封问题

2019-10-14 21:27 597 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/crazytom1988/article/details/102557210

讲解:https://mp.weixin.qq.com/s/EWLi6sP3l4xsuc6GDpQAjw

https://mp.weixin.qq.com/s/wK3zCwMtT04DdvTo-FzQ1Q

 

https://leetcode-cn.com/problems/longest-increasing-subsequence/ (LIS)

 O(N^2)解法

[code]class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) return 0;

vector<int> dp(nums.size(), 1);
int ans = 1;
for (int i = 1; i < nums.size(); ++i)
{
for (int j = 0; j < i; ++j)
{
if (nums[j] < nums[i])
dp[i] = max(dp[i],dp[j]+1);
}
ans = max(dp[i],ans);
}
return ans;
}
};

二分查找 O(NlogN)

[code]class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) return 0;

int top[nums.size()]={};
int piles = 0;

for (int i = 0; i < nums.size(); ++i)
{
int poker = nums[i];
int left = 0;
int right = piles;
while(left<right)
{
int mid = left +((right-left)>>1);
if (top[mid] >= poker)
{
right = mid;
}
else
{
left = mid + 1;
}
}

if (left == piles) ++piles;
top[left] = poker;
}
return piles;
}
};

https://leetcode-cn.com/problems/russian-doll-envelopes/ (俄罗斯套娃)

[code]bool cmp(const vector<int> &a, const vector<int> &b)
{
if (a[0] == b[0])
return a[1] > b[1];
return a[0] < b[0];
}

class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), cmp);
vector<int> height(envelopes.size());
for (int i = 0; i < envelopes.size(); ++i)
height[i] = envelopes[i][1];

return lengthOfLIS(height);
}

int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) return 0;

int top[nums.size()]={};
int piles = 0;

for (int i = 0; i < nums.size(); ++i)
{
int poker = nums[i];
int left = 0;
int right = piles;
while(left<right)
{
int mid = left +((right-left)>>1);
if (top[mid] >= poker)
{
right = mid;
}
else
{
left = mid + 1;
}
}

if (left == piles) ++piles;
top[left] = poker;
}
return piles;
}
};

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: