Leetcode 4月14日周赛题解...
swtcl,第三题明明 5 min 写个 bf 就能过但我特么想了 40+min 的 dp 和启发式搜索(哭

(然后时间到了之后同学说 bf 能过然后我就试了一下,然后就过了...)
我离 1h AK 就差那么一点点.jpg

wc132.jpg

总的来说这周题不算难,虽然有一道 8 分题但是稍微想想就能过。
Contest链接在这里

1025. Divisor Game

题目大意

Alice 和 Bob 轮流玩游戏,Alice 先走,规则是给出一个数 N,每次每名玩家可以选择一个能被 N 整除的数 x,然后令 N N-x,如果轮到谁的时候数字是 1,那么这个人输。
输入一个 N, 问 Alice 能不能获胜。

思路

因为 N 为奇数的时候,玩家只能取一个奇数,此时 N 会变为偶数,而 N 为偶数的时候,先走玩家总有一种策略必定获胜。

代码

我特么提交的时候第一次还忘了写 == 0 结果就给了一个错误提交噗x

class Solution {
public:
    bool divisorGame(int N) {
        return N % 2 == 0;
    }
};

1026. Maximum Difference Between Node and Ancestor

题目大意

给出一颗二叉树,求两个节点 A, B 使得他们的差值最大且 AB 的祖先节点,输出差值。

思路

dfs,维护路径上的最大最小值即可。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    int dfs(TreeNode *root, int mx, int mn) {
        if (root == nullptr) return 0;
        if (root->val > mx) mx = root->val;
        if (root->val < mn) mn = root->val;
        if (root->left == nullptr && root->right == nullptr) return abs(mx - mn);
        return max(dfs(root->left, mx, mn), dfs(root->right, mx, mn));
    }
public:
    int maxAncestorDiff(TreeNode* root) {
        return dfs(root, root->val, root->val);
    }
};

1027. Longest Arithmetic Sequence

题目大意

给出一个无序数组,求其最长等差子序列的长度,其中子序列不要求连续。

思路

bf........................................

代码

class Solution {
public:
    int longestArithSeqLength(vector<int>& A) {
        int mx = 2;
        for (int i = 0; i < A.size(); ++i) {
            for (int j = i + 1; j < A.size(); ++j) {
                auto d = A[j] - A[i];
                auto cnt = 2;
                auto pre = A[j];
                for (int k = j + 1; k < A.size(); ++k) {
                    if (A[k] - pre == d) {
                        pre = A[k];
                        ++cnt;
                        mx = max(cnt, mx);
                    }
                }
            }
        }
        return mx;
    }
};

1028. Recover a Tree From Preorder Traversal

题目大意

给定一颗二叉树的先序遍历结果,每个节点之前有若干个 - 来表示这个节点的深度,要求还原这颗二叉树。
其中,如果一个节点有且只有一个孩子,那么其为左孩子。

思路

用一个 map 来维护第 i 层的父亲节点,然后从这个父亲节点构造孩子节点。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* recoverFromPreorder(string S) {
        stringstream ss(S);
        int val;
        int depth;
        map<int, TreeNode*> n;
        ss >> val;
        n[1] = new TreeNode(val);
        while (ss) {
            char c;
            depth = 0;
            while ((c = ss.get()) == '-') depth++;
            ss.unget();
            ss >> val;
            if (!ss) break;
            if (n[depth]->left == nullptr) {
                n[depth]->left = new TreeNode(val);
                n[depth+1] = n[depth]->left;
            } else {
                n[depth]->right = new TreeNode(val);
                n[depth+1] = n[depth]->right;
            }
        }
        return n[1];
    }
};

标签: oj, 算法, leetcode

添加新评论