LeetCode 1907, 392, 104

1907. 按分类统计薪水

题目链接

1907. 按分类统计薪水

  • Accounts的字段为account_idincome

要求

  • 查询每个工资类别的银行账户数量。 工资类别如下:
  • “Low Salary”:所有工资 严格低于 20000 美元。
  • “Average Salary”: 包含 范围内的所有工资 [$20000, $50000] 。
  • “High Salary”:所有工资 严格大于 50000 美元。
  • 结果表 必须 包含所有三个类别。如果某个类别中没有帐户,则报告 0 。
  • 任意顺序 返回结果表。

知识点

  1. count():统计个数的函数。
  2. if():条件判断函数,如果满足条件,返回第二个参数,否则返回第三个参数。
  3. union:合并两个查询结果。

思路

本题的思路很简单,按照要求求出各个工资水平的人的个数,然后用union将其 联合 起来。

代码

select
    'Low Salary' category,
    count(if(income < 20000, 1, null)) accounts_count
from
    Accounts
union
select
    'Average Salary' category,
    count(if(20000 <= income and income <= 50000, 1, null)) accounts_count
from
    Accounts
union
select
    'High Salary' category,
    count(if(income > 50000, 1, null)) accounts_count
from
    Accounts

392. 判断子序列

题目链接

392. 判断子序列

标签

双指针 字符串 动态规划

思路

本题只需要遍历一遍字符串t,然后匹配字符串s中的所有字符即可。从s的第一个字符开始,每次匹配成功s中到一个字符,就匹配s的下一个字符。

代码

class Solution {
    public boolean isSubsequence(String s, String t) {
        int i = 0; // i是字符串s的索引
        char[] sC = s.toCharArray();
        char[] tC = t.toCharArray();
        for (int j = 0; j < tC.length && i < sC.length; j++) { // j是字符串t的索引
            if (sC[i] == tC[j]) { // 如果匹配成功
                i++; // 则匹配s的下一个字符
            }
        }
        return i == sC.length;
    }
}

104. 二叉树的最大深度

题目链接

104. 二叉树的最大深度

标签

树 深度优先搜索 广度优先搜索 二叉树

递归

思路

要想获取一个节点的最大深度,得先求出它的左子树的深度leftDepth和右子树的深度rightDepth,然后取较大值 + 1 作为本节点的深度Math.max(leftDepth, rightDepth) + 1。为什么要加一,因为本节点也算一层深度。如果发现本节点为null,那么本节点的深度为0

代码

class Solution {
    public int maxDepth(TreeNode curr) {
        if (curr == null) { // 如果本节点为null
            return 0; // 则返回深度为0
        }
        int leftDepth = maxDepth(curr.left); // 获取左子树的深度
        int rightDepth = maxDepth(curr.right); // 获取右子树的深度
        return Math.max(leftDepth, rightDepth) + 1; // 取 较大值+1 作为本节点的深度
    }
}

迭代

思路

可以将 求二叉树的最大深度 看作 对二叉树的层序遍历(层序遍历就是一层一层地遍历,每层节点距离根节点的距离是一样的),总共能遍历多少层,最大深度就是多少。

层序遍历 是一种 广度优先搜索,所以可以使用 队列。共有两层循环,外层循环就是对二叉树一层一层地循环,内层循环就是将本层的节点按从左到右的顺序(因为本题只是求深度,所以与顺序无关,可以不在乎顺序)遍历,遍历时再给队列添加本层节点的两个子节点(要求两个子节点不为null,如果为null,则最后求出来的深度比正确结果大1),内层循环完毕后将深度加一,直到队列没有元素。

代码

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int depth = 0;
        Queue<TreeNode> queue = new LinkedList<>(); // 队列存储了各层的所有元素
        queue.offer(root); // 先放入根节点
        while (!queue.isEmpty()) {
            int size = queue.size(); // 本层节点的个数
            for (int i = 0; i < size; i++) {
                TreeNode poll = queue.poll();
                if (poll.left != null) { // 如果左子节点不为空
                    queue.offer(poll.left); // 则放入左子节点
                }
                if (poll.right != null) { // 如果右子节点不为空
                    queue.offer(poll.right); // 则放入右子节点
                }
            }
            depth++; // 深度+1
        }
        return depth;
    }
}
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值