LeetCode第 283 场周赛题解
6016. Excel 表中某个范围内的单元格
题目描述:自己读题
思路:根据题意模拟即可
时间复杂度:\(O(能过)\)
参考代码:
class Solution {
public:
vector cellsInRange(string s) {
vector res;
int lr = s[0] - 'A', rs = s[3] - 'A';
int len1 = s[1] - '0' , len2 = s[4] - '0';
for(int i = lr ; i <= rs ; ++i){
for(int j = len1 ; j <= len2 ; ++j){
string str = (char)('A' + i) + to_string(j);
res.push_back(str);
}
}
return res;
}
};
6017. 向数组中追加 K 个整数
题目描述:给你一个数组\(nums\),让你添加\(k\)个不在\(nums\)中出现的数字,并且使得这\(k\)个数字的和最小。
思路:比较明显的贪心,先假定最终添加的是\([1...k]\),然后根据其中的数字是否在\(nums\)中出现过进行修改即可。
时间复杂度:\(O(nlogn)\)
参考代码:
class Solution {
public:
long long minimalKSum(vector& nums, int k) {
long long res = 1ll * k * (k + 1) / 2;
sets;
for(int& num : nums) s.insert(num) ;
for(auto& val : s){
if(val > k) break;
if(val <= k) res -= val;
++k;
res += k;
}
return res;
}
};
6018. 根据描述创建二叉树
题目描述:给定父子关系,根据父子关系构建二叉树,保证有解。
思路:根据题意模拟即可
时间复杂度:\(O(n)\)
参考代码:
class Solution {
public:
TreeNode* createBinaryTree(vector>& descriptions) {
vector tr(100005 , nullptr);
vectorincome(100005 , 0), outcome(100005 , 0);
sets;
for(auto& des : descriptions){
int u = des[0] , v = des[1] , w = des[2];
if(tr[u] == nullptr) tr[u] = new TreeNode(u , nullptr , nullptr);
if(tr[v] == nullptr) tr[v] = new TreeNode(v , nullptr , nullptr);
if(w == 0) tr[u]->right = tr[v];
else tr[u]->left = tr[v];
income[v]++;
outcome[u]++;
s.insert(u);
s.insert(v);
}
int rt = 0;
for(auto& v : s){
if(income[v] != 0 || outcome[v] == 0) continue;
rt = v;
break;
}
return tr[rt];
}
};
6019. 替换数组中的非互质数
题目描述:给你一个整数数组 nums
。请你对数组执行下述操作:
- 从
nums
中找出 任意 两个 相邻 的 非互质 数。 - 如果不存在这样的数,终止 这一过程。
- 否则,删除这两个数,并 替换 为它们的 最小公倍数(Least Common Multiple,LCM)。
- 只要还能找出两个相邻的非互质数就继续 重复 这一过程。
返回修改后得到的 最终 数组。可以证明的是,以 任意 顺序替换相邻的非互质数都可以得到相同的结果。
思路:比较明显的模拟,使用栈维护一下即可。我为了输出方便使用了双端队列。
时间复杂度:\(O(nlogn)\)
参考代码:
class Solution {
public:
vector replaceNonCoprimes(vector& nums) {
dequeq;
for(auto& num : nums){
if(q.empty()) q.push_back(num);
else{
int u = q.back();
int gd = gcd(u , num);
if(gd == 1) q.push_back(num);
else{
q.pop_back();
long long dx = 1ll * u * num / gd;
while(!q.empty() && gcd(dx , q.back()) != 1){
u = q.back();
q.pop_back();
dx = 1ll * dx * u / gcd(dx , 1ll * u);
}
q.push_back(dx);
}
}
}
vectorres;
while(!q.empty()){res.push_back(q.front()); q.pop_front();}
return res;
}
};