429. N 叉树的层序遍历 / 剑指 Offer 62. 圆圈中最后剩下的数字 / 175. 组合两个表 / 1581. 进店却未进行过交易的顾客 / 1148. 文章浏览 I

本文解析了如何使用BFS(广度优先搜索)算法实现N叉树的层序遍历,同时对比了递归方法,探讨了队列在解决这类问题中的优势。通过实例代码展示了如何在Java中操作Node类结构,并介绍了剑指Offer题目62的约瑟夫环问题解法。
摘要由CSDN通过智能技术生成

429. N 叉树的层序遍历【中等题】【每日一题】

本题之前写过一遍,当时用的BFS+递归
N 叉树的层序遍历
今天看到题解用的BFS+队列,也试了一下,用时没有递归快。

代码:

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root != null){
            //定义一个队列来存储每一层的节点
            Queue<Node> queue = new LinkedList<>();
            //初始化队列,将根节点存入
            queue.offer(root);
            while(!queue.isEmpty()){//当队列不为空时
                int len = queue.size();//求当前队列的长度len
                //定义存放当前层节点值的列表level
                List<Integer> level = new ArrayList<>();
                for(int i = 0;i < len ; i++){//遍历当前队列中前len个节点
                    Node cur = queue.poll();//将队列头部的节点取出
                    level.add(cur.val);//level中添加当前节点的值
                    for(Node child : cur.children){//遍历当前节点的所有子节点
                        //将子节点添加到队列尾部
                        queue.offer(child);
                    }
                }
                list.add(level);//list中更新每一层对应的节点值列表
            }
        }
        return list; 
    }
}

剑指 Offer 62. 圆圈中最后剩下的数字【简单题】

思路:【约瑟夫环】

数学规律,先确定最后一个幸存的元素的下标必然是0,然后倒数第2轮的下标必然是 (0 + m) % 2,依次倒序推导,倒数第i轮的下标 为
(ans + m)% i ,其中ans为在倒数第i-1轮中幸存元素的下标。

代码:

class Solution {
    public int lastRemaining(int n, int m) {
        int ans = 0;//ans表示最后幸存的那个数字在每一轮中的下标,由于是倒着推导,所以当最后仅幸存一个数字时,它的下标是0
        for (int i = 2; i <= n; i++) {//i表示当前环的长度,从长度为2的环开始倒推
            ans = (ans + m) % i;
        }
        return ans;
    }
}

175. 组合两个表【简单题】

在这里插入图片描述
在这里插入图片描述

# Write your MySQL query statement below
select Person.firstname,Person.lastname,Address.city,Address.state
from Person left join Address
on Person.personId = Address.personId;

1581. 进店却未进行过交易的顾客【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
# 查找 customer_id 和 当前customer对应的visit_id数据的个数 
select Visits.customer_id,count(Visits.visit_id) as count_no_trans  
from Visits left join Transactions # Visits左连Transactions
on Visits.visit_id = Transactions.visit_id  # 连接点为 visit_id
where Transactions.transaction_id is null # 查找条件为 transaction_id是null
group by Visits.customer_id; # 以customer_id分组

1148. 文章浏览 I【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
select distinct author_id as `id`  # 查找author_id 去除重复的
from Views # 从Views表
where author_id = viewer_id  # 查找条件为 author_id = viewer_id
group by article_id # 以article_id 分组
order by id; # 将 id 升序排列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值