2021/8/21
极客时间 3讲;内容较多 消化吃力
笔试一场
两个leetcode困难题目
2场面试
[//]: # (支持粘贴图片啦🎉🎉🎉)
[//]: # (保存的笔记可以在小程序中查看)
```
class Solution {
public:
int dp[100100];
int sum[100100];int a[100100],b[100100];
void merge(vector<int>& nums,int l,int r,int mid){
int top = 0;
int l1 = mid + 1,s = l;
while(true){
if(l <= mid && l1 <= r){
if(nums[l] <= nums[l1]){
dp[sum[l]] += l1 - (mid + 1);
a[++ top] = nums[l];
b[top] = sum[l];
++ l;
} else if(nums[l] > nums[l1]){
// dp[sum[l1]] += l - s;
a[++ top] = nums[l1];
b[top] = sum[l1];
++ l1;
}
} else if(l <= mid){
dp[sum[l]] += l1 - (mid + 1);
a[++ top] = nums[l];
b[top] = sum[l];
++ l;
} else if(l1 <= r){
a[++ top] = nums[l1];
b[top] = sum[l1];
++ l1;
} else break;
}
for(int i = s; i <= r; i ++){
nums[i] = a[i - s + 1];
sum[i] = b[i - s + 1];
}
}
void dfs(vector<int>& nums,int l,int r){
if(l == r){
return ;
}
if(l + 1 == r){
merge(nums,l,r,l);
return ;
}
int mid = (l + r) >> 1;
dfs(nums,l,mid);
dfs(nums,mid + 1,r);
merge(nums,l,r,mid);
return ;
}
vector<int> countSmaller(vector<int>& nums) {
for(int i = 0; i < nums.size(); i ++) sum[i] = i;
dfs(nums,0,nums.size() - 1);
vector<int> ans;
for(int i = 0; i < nums.size(); i ++) ans.push_back(dp[i]);
return ans;
}
};
[//]: # (支持粘贴图片啦🎉🎉🎉)
[//]: # (保存的笔记可以在小程序中查看)
```
class Solution {
public:
int dp[5010];
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) {
return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);
});
int top = 0;
for(int i = 0; i < envelopes.size(); i ++){
if(top == 0 || dp[top] < envelopes[i][1]){
dp[++ top] = envelopes[i][1];
} else {
int id = lower_bound(dp + 1,dp + top + 1,envelopes[i][1]) - dp;
dp[id] = envelopes[i][1];
}
}
return top;
}
};
```
```


浙公网安备 33010602011771号