滴滴2023后端 序列拆分
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;
int auxFunc(vector<int> res, vector<int>nums,vector<int> maxLen,int end)
{
unordered_set<int>unmap;
for (int i = end, j = res.size(); j > 0; --i)
{
if (maxLen[i] == j)
{
// 表示在 arr[i] 这个位置的最大长度为 j 也就是说 这个位置的值应该是 arr[i]
res[--j] = nums[i];
}
}
// 此时res中就是最终的递增子序列
for (int i = 0; i < res.size(); i++)
{
unmap.insert(res[i]);
}
int i = 0;
while (i < nums.size())
{
if (unmap.find(nums[i]) != unmap.end())
{
i++;
}
else
{
break;
}
}
int temp = nums[i];
i++;
for (; i < nums.size(); i++)
{
// 不再
if (unmap.find(nums[i]) == unmap.end() && nums[i] < temp)
{
temp = nums[i];
}
if (unmap.find(nums[i]) != unmap.end())
{
continue;
}
if(unmap.find(nums[i]) == unmap.end() && nums[i] > temp)
{
return 0;
}
}
return 1;
}
int main()
{
int n;
cin >> n;
while (n--)
{
int m;
cin >> m;
vector<int> nums;
for (int i = 0; i < m; i++)
{
int num;
cin >> num;
nums.push_back(num);
}
// 找到数组中的单调递增序列
vector<int>maxLen;
vector<int>res; // res[i]表示在 i 处
res.emplace_back(nums[0]);
maxLen.emplace_back(1);
for (int i = 1; i < m; i++)
{
if (nums[i] > res.back())
{
res.emplace_back(nums[i]);
maxLen.emplace_back(res.size());
}
else
{
int pos = lower_bound(res.begin(), res.end(), nums[i]) - res.begin();
res[pos] = nums[i];
maxLen.emplace_back(pos + 1);
}
// 计算出
int t = auxFunc(res, nums, maxLen,i);
if (t == 1)
{
cout << "Yes" << endl;
break;
}
if (i == m - 1)
{
cout << "No" << endl;
}
}
}
}
#滴滴实习生#

查看13道真题和解析