第 277 场周赛(模拟+数列求和+二叉树+最大公倍数/最小中约数/栈)

1.模拟

class Solution {
public:
    vector<string> cellsInRange(string s) {
        vector<string> ans;
        char c1 = s[0];
        char c2 = s[3];
        char n1 = s[1];
        char n2 = s[4];
        for(char c = c1; c <= c2; c++){
            for(char n = n1; n <= n2; n++){
                string temp = "";
                temp += c;
                temp += n;
                ans.push_back(temp);
            }
        }
        return ans;
    }
};

2.数列求和(首尾项求和公式)

class Solution {
public:
    long long minimalKSum(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        
        int cnt = 0;

        long long ans = 0;
        
        nums.insert(nums.begin(), 0);
        int n = nums.size();
        for(int i = 1; i < n; i++){
            if(cnt >= k) break;
            
            int len = nums[i] - nums[i - 1] - 1;
            
            //cout << ans << " " << k - cnt << " " << len << endl;
            
            //cout << nums[i - 1] << " " << nums[i] << endl;
            if(nums[i - 1] + 1 == nums[i] || nums[i - 1] == nums[i]) continue;
            
            if(k - cnt >= len){
                //cout << "1 : "<< nums[i - 1] + 1 << " " << nums[i] - 1 << endl;
                ans += ((long long)nums[i - 1] + 1 + nums[i] - 1) * len / 2;
                
                cnt += len;
            }else{
                //cout << "2 : "<<nums[i - 1] + 1 << "" << nums[i - 1] + 1 + k - cnt - 1 << endl;
                ans += ((long long)nums[i - 1] + 1 + nums[i - 1] + 1 + k - cnt - 1) * (k - cnt) / 2;
                
                cnt += len;
            }
        }
        //cout << k - cnt << endl;
        if(cnt < k){
            ans += ((long long)nums[nums.size() - 1] + 1 + nums[nums.size()- 1] + 1 + k - cnt - 1) * (k - cnt) / 2;
        }
        return ans;
    }
};

3.构建二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* createBinaryTree(vector<vector<int>>& d) {
        unordered_map<int, TreeNode*> m;
        int n = d.size();
        for(int i = 0; i < n; i++){
            TreeNode* node = new TreeNode(d[i][1]);
            m[d[i][1]] = node;
        }
        TreeNode* head;
        for(int i = 0; i < n; i++){
            if(!m.count(d[i][0])){
                head = new TreeNode(d[i][0]);
                m[d[i][0]] = head;
                break;
            }
        }
        for(int i = 0; i < n; i++){
            TreeNode* f = m[d[i][0]];
            TreeNode* c = m[d[i][1]];
            if(d[i][2] == 1){
                f->left = c;
            }else{
                f->right = c;
            }
        }
        return head;
    }
};

4.最大公倍数/最小中约数/栈

  • ab=最大公约数*最小公倍数
class Solution {
public:
    vector<int> replaceNonCoprimes(vector<int>& nums) {
        stack<int> s;

        int pre = nums[0];
        int n = nums.size();
        for(int i = 1; i < n; i++){
            if(gcd(pre, nums[i]) > 1){
                pre =  (long long)pre * nums[i] / gcd(pre, nums[i]);
            }else{
                while(!s.empty() && gcd(pre, s.top()) > 1){
                    pre = (long long) pre * s.top() / gcd(pre, s.top()) ;
                    s.pop();
                }
                s.push(pre);
                pre = nums[i];
            }
        }
        while(!s.empty() && gcd(pre, s.top()) > 1){
            pre = (long long)pre * s.top() /  gcd(pre, s.top());
            s.pop();
        }
        s.push(pre);

        vector<int> ans;
        while(!s.empty()){
            ans.push_back(s.top());
            s.pop();
        }
        reverse(ans.begin(), ans.end());
        return ans;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prince_H_23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值