🌽第150周的题解

第一题

5048. 拼写单词

要求:
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和。
示例1:

输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释: 
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

示例2:

输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。

思路:
直接把字符串问题转化成为一个大小为26的数组,对给定的「字母表」进行遍历,将数组的对应位置记录下每个字母出现了多少次,再循环一遍给出的「词汇表」,只要词汇表每个都比给定的字母表的数组元素小,那么就说明可以表示。

solution in cpp:

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        int s[26],t[26],i,result = 0;
        memset(s,0,sizeof(s));
        for(auto c:chars)s[c-'a']++;
        for(auto d:words){
            memset(t,0,sizeof(t));
            for(auto e:d)t[e-'a']++;
            for(i=0;i<26;i++) if(s[i]<t[i]) break;
            if(i==26) result+=d.size();
        }
        return result;
    }
};

第二题

5052.最大层内元素和

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
给定一个二叉树 大概长下面这样
实例:

输入:[1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

思路:
使用一个dict用来存储每一层的元素的值,每一对键值对都是层数和相对应的值的和,使用dfs遍历所有树的节点,同时将节点所在的层数传进去,传进去的同时直接访问对应的dict对应的元素,直接加起来,最后遍历一遍输出最大的值

  • solution in cpp:
/**
 * 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:
    int s[10005], n;
    void dfs(TreeNode* root, int level){
        if(!root) return;
        n = max(n,level);
        s[level]+=root->val;
        dfs(root->left,level+1);
        dfs(root->right,level+1);
    }
    int maxLevelSum(TreeNode* root) {
        memset(s,0,sizeof(s));
        n = 0;
        dfs(root,1);
        int j = 1;
        for(int i = 1;i<=n;i++){
            if(s[i] > s[j])
                j = i;
        }
        return j;
    }
};
  • solution in python:
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    
    def maxLevelSum(self, root: TreeNode) -> int:
        m,res,level = {},0,0
        def dfs(root,level):
            if root == None:
                return
            if level not in m:
                m[level] = 0
            m[level]+=root.val
            dfs(root.left,level+1)
            dfs(root.right,level+1)
        dfs(root, 1)
        min_ = -sys.maxsize
        for key in m.keys():
            if m[key] > min_:
                min_, res = m[key], key
        return res

第三题

5053.地图分析

你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。

我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。

如果我们的地图上只有陆地或者海洋,请返回 -1。

实例1:
实例

输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。

太菜了 没做出来