310. 最小高度树 / 1667. 修复表中的名字 / 1484. 按日期分组销售产品 / 1527. 患某种疾病的患者

310. 最小高度树【中等题】【每日一题】

思路:【看评论区~】

这题不会写的原因,我觉得至少有一半得归因于 看不懂题目在说什么~

那么我先写一下,我看完题解后理解的 题目在问什么:

题目给了你一个无向图,图上有很多节点,让你找出这些节点中,距离叶子节点距离最小的那些节点。

那么如何解决呢?
可以将所有的叶子节点找出来,将它们添加到队列里,使用while循环对队列进行处理,去掉所有的叶子节点,处理过程中,对这些叶子节点的相邻节点进行筛选,如果在下一轮筛选过程中有可能成为叶子节点,就将其添加到队列中。当处理完所有的叶子节点后,剩下的节点就是距离叶子节点距离最小的那些节点。

具体代码实现见代码注释,本文主要参考自力扣评论区小鑫大佬的题解

代码:

class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> ans = new ArrayList<>();
        //如果只有一个节点,那么它就是最小高度树
        if (n == 1){
            ans.add(0);
            return ans;
        }
        //建立各个节点的度表
        int[] parent = new int[n];
        //建图
        List<Integer>[] adj = new List[n];
        for (int i = 0; i < n; i++) {
            adj[i] = new ArrayList<>();
        }
        for (int[] edge : edges) {
            adj[edge[0]].add(edge[1]);
            adj[edge[1]].add(edge[0]);
            parent[edge[0]]++;
            parent[edge[1]]++;
        }
        //建立队列
        Queue<Integer> queue = new LinkedList<>();
        //把所有度为1的节点,也就是叶子节点加入队列
        for (int i = 0; i < n; i++) {
            if (parent[i] == 1){
                queue.offer(i);
            }
        }
        //当queue不为空时
        while (!queue.isEmpty()){
            ans = new ArrayList<>();//保存结果集合
            int size = queue.size();//记录每一层的节点数量
            for (int i = 0; i < size; i++) {
                int cur = queue.poll();//弹出队列中一个叶子节点
                ans.add(cur);//把当前节点加入结果集
                List<Integer> neighbors = adj[cur];//拿到当前节点的相邻节点
                //剪掉当前节点
                for (Integer neighbor : neighbors) {
                    parent[neighbor]--;//其相邻节点的度也会减1
                    if (parent[neighbor] == 1){
                        queue.offer(neighbor);//如果相邻节点因此变为了叶子节点,那么就将其添加入队列中
                    }
                }
            }
        }
        return ans;
    }
}

1667. 修复表中的名字【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
select user_id , concat(upper(left(name,1)),lower(substring(name,2))) as `name`
from Users
order by user_id;

1484. 按日期分组销售产品【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
select sell_date,
count(distinct product) as `num_sold`,# 统计产品的数量
# 将产品按照当前分组进行拼接,默认排序从小到大,即字典序,默认拼接符为 , 
group_concat(distinct product) as `products` 
from Activities
group by sell_date # 按sell_date分组
order by sell_date; # 结果集按sell_date从小到大排序

1527. 患某种疾病的患者【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
select *
from Patients
where conditions rlike '^DIAB1|.*\\sDIAB1';# rlike表示判断数据是否与正则表达式相匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值