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表示判断数据是否与正则表达式相匹配