返回顶部

LeetCode第 283 场周赛题解

6016. Excel 表中某个范围内的单元格

题目描述:自己读题

思路:根据题意模拟即可

时间复杂度:\(O(能过)\)

参考代码:

class Solution {
public:
    vector<string> cellsInRange(string s) {
        vector<string> 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<int>& nums, int k) {
        long long res = 1ll * k * (k + 1) / 2;
        set<int>s;
        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<vector<int>>& descriptions) {
        vector<TreeNode*> tr(100005 , nullptr);
        vector<int>income(100005 , 0), outcome(100005 , 0);
        set<int>s;
        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 。请你对数组执行下述操作:

  1. nums 中找出 任意 两个 相邻非互质 数。
  2. 如果不存在这样的数,终止 这一过程。
  3. 否则,删除这两个数,并 替换 为它们的 最小公倍数(Least Common Multiple,LCM)。
  4. 只要还能找出两个相邻的非互质数就继续 重复 这一过程。

返回修改后得到的 最终 数组。可以证明的是,以 任意 顺序替换相邻的非互质数都可以得到相同的结果。

思路:比较明显的模拟,使用栈维护一下即可。我为了输出方便使用了双端队列。

时间复杂度:\(O(nlogn)\)

参考代码:

class Solution {
public:
    vector<int> replaceNonCoprimes(vector<int>& nums) {
        deque<long long>q;
        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);
                }
            }
        }
        vector<int>res;
        while(!q.empty()){res.push_back(q.front()); q.pop_front();}
        return res;
    }
};
posted @ 2022-03-06 15:46  cherish-lgb  阅读(28)  评论(0编辑  收藏  举报