力扣第307场周赛

LeetCode 2383. 赢得比赛需要的最少训练时长

题目链接:

2383. 赢得比赛需要的最少训练时长 - 力扣(LeetCode)

解题思路:

模拟题根据题目要求写出代码即可:

class Solution {
public:
    int minNumberOfHours(int a, int b, vector& a1, vector& b1) {
        int n = a1.size();
        
        int t = 0;
        for (int i = 0; i < n; i ++ )
        {
            if (a > a1[i] && b > b1[i]) 
            {
                a -= a1[i];
                b += b1[i];
            }
            else if (a <= a1[i] || b <= b1[i])
            {
                while (a <= a1[i]) t ++ , a ++ ;
                while (b <= b1[i]) t ++ , b ++ ;
                a -= a1[i], b += b1[i];
            }
        }
        
        return t;
    }
};

LeetCode 2384. 最大回文数字

题目链接:

2384. 最大回文数字 - 力扣(LeetCode)

class Solution {
public:
    string largestPalindromic(string num) {
        vector idx(15, 0);
        vector st(15, false);
        for (int i = 0; i < num.size(); i ++ )
            idx[num[i] - '0'] ++ ;//记录每个数字出现的次数
        
        string ans;
        for (int i = 9; i ; i -- )//从最大的开始找,找出回文数的第一个数
            if (idx[i] >= 2)
            {
                ans = to_string(i);
                idx[i] -= 2;
                break;
            }
        
        if (!ans.size())//说明没有任意一个数出现的次数大于等于2
        {
            for (int i = 9; i >= 0; i -- )//输出最大的一个数
                if (idx[i])
                    return to_string(i);
        }

            for (int i = 9; i >= 0; i -- )//找出回文数的左半段
                while (idx[i] >= 2)
                {
                    ans += to_string(i);
                    idx[i] -= 2;
                }
        
        string res = ans;//左半段翻转即为右半段
        reverse(res.begin(), res.end());
        
        for (int i = 9; i >= 0; i -- )
            if (idx[i])//找出应该在中间的那个数
            {
                ans += to_string(i);
                break;
            }
        
        return ans + res;
    }
};

LeetCode 2385. 感染二叉树需要的总时间

题目链接:

2385. 感染二叉树需要的总时间 - 力扣(LeetCode)

解题思路:
将根结点与它的左右儿子连一条双向边,然后bfs求出答案即可

/**
 * 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) {}
 * };
 */
const int N = 100010, M = 2 * N;
int h[N], e[M], ne[M], idx;
class Solution {
public:
    
    void add(int a, int b)//邻接表模板
    {
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx;
        idx ++ ;
    }
    void dfs(TreeNode* root)//将根节点与它的左右儿子连一条双向边
    {
        if (root -> left)
        {
            add(root -> val, root -> left -> val);
            add(root -> left -> val, root -> val);
            dfs(root -> left);
        }
        
        if (root -> right)
        {
            add(root -> val, root -> right -> val);
            add(root -> right -> val, root -> val);
            dfs(root -> right);
        }
    }
    int amountOfTime(TreeNode* root, int start) {
        idx = 0;
        memset(h, -1, sizeof h);
        dfs(root);
        
        int dist[N];
        memset(dist, 0x3f, sizeof dist);
    
        queue q;
        q.push(start);
        dist[start] = 0;
        
        int res = 0;
        while (q.size())//bfs模板
        {
            int t = q.front();
            q.pop();
            res = max(res, dist[t]);
            
            for (int i = h[t]; i != -1; i = ne[i])
            {
                int j = e[i];
                if (dist[j] > dist[t] + 1)
                {
                    dist[j] = dist[t] + 1;
                    q.push(j);
                }
            }
        }
        
        return res;
    }
};

第四题:

楼主上课去了。。。

你可能感兴趣的:(力扣周赛,leetcode,算法,职场和发展)