美团开奖了,开的比要的还多。。。

科技   2024-11-02 11:10   上海  

精品推荐

《征服数据结构》专栏:50多种数据结构彻底征服

《经典图论算法》专栏:50多种经典图论算法全部掌握


最近美团陆续开奖了,给的薪资大家还是比较满意的,很多网友也都晒出了自己的薪资,有的开的比要的还多,给hr说的期望薪资是27k,结果开了30k,这是要少了吗?


我印象中都很久没点外卖了,都快把它给卸载了,刚查了一下美团的市值,从9月份到10月份一路狂奔,市值翻了一倍,怪不得美团这次给的这么爽快。












--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第103题:二叉树的锯齿形层序遍历。


问题描述



来源:LeetCode第103题
难度:中等

给你二叉树的根节点 root ,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例1:

输入:root = [3,9,20,null,null,15,7]

输出:[[3],[20,9],[15,7]]

示例2:

输入:root = [1]

输出:[[1]]


  • 树中节点数目在范围 [0, 2000] 内

  • -100 <= Node.val <= 100


问题分析



这题是让锯齿形返回二叉树的层序遍历,层序遍历也就是一层一层的打印二叉树的节点值,而锯齿形遍历也就是先从左往右,然后下一层在从右往左,接着在下一层又从左往右,就这样交替……。

对于二叉树的层序遍历我们前面也多次讲过,不同的是这里需要有一个变量来记录方向,是从左往右还是从右往左。

在打印节点值的时候区分方向,对于Java和C++语言我们可以使用双端队列deque,它的两边都可以操作(Java中的LinkedList实现了Deque接口)。而Python还是按照原来的方式添加,最后在进行反转即可。

JAVA:
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    List<List<Integer>> ans = new ArrayList<>();
    if (root == null)
        return ans;
    Queue<TreeNode> queue = new LinkedList<>();// 创建队列
    queue.add(root);// 根节点添加到队列中
    boolean leftToRight = true;
    while (!queue.isEmpty()) {
        // 当前层的节点个数
        int count = queue.size();
        List<Integer> mList = new LinkedList<>();// 当前层的集合
        // 遍历这一行的所有节点
        for (int i = 0; i < count; i++) {
            TreeNode node = queue.poll();
            // 判断是从左往右打印还是从右往左打印。
            if (leftToRight) {// 从左往右添加到后面
                mList.add(node.val);
            } else {// 从右往左添加到前面
                mList.add(0, node.val);
            }
            // 左右子节点如果不为空会被加入到队列中
            if (node.left != null)
                queue.add(node.left);
            if (node.right != null)
                queue.add(node.right);
        }
        ans.add(mList);
        leftToRight = !leftToRight;// 下一步更改方向
    }
    return ans;
}

C++:
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode *root) {
        vector<vector<int>> ans;
        if (root == nullptr)
            return ans;
        queue<TreeNode *> nodeQueue;// 创建队列
        nodeQueue.push(root);// 根节点添加到队列中
        bool leftToRight = true;
        while (!nodeQueue.empty()) {
            // 当前层的节点个数
            int count = nodeQueue.size();
            deque<int> levelList;// 当前层的集合
            // 遍历这一行的所有节点
            for (int i = 0; i < count; i++) {
                TreeNode *node = nodeQueue.front();
                nodeQueue.pop();
                // 判断是从左往右打印还是从右往左打印。
                if (leftToRight) {// 从左往右添加到后面
                    levelList.push_back(node->val);
                } else {// 从右往左添加到前面
                    levelList.push_front(node->val);
                }
                // 左右子节点如果不为空会被加入到队列中
                if (node->left)
                    nodeQueue.push(node->left);
                if (node->right)
                    nodeQueue.push(node->right);
            }
            ans.emplace_back(vector<int>{levelList.begin(), levelList.end()});
            leftToRight = !leftToRight;// 下一步更改方向
        }
        return ans;
    }

Python:
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    ans = []
    if root is None:
        return ans
    q = deque([root])  # 创建队列,顺便把根节点添加到队列中
    leftToRight = True
    while q:
        mList = []  # 当前层的集合
        # 遍历这一行的所有节点
        for _ in range(len(q)):
            node = q.popleft()
            mList.append(node.val)
            # 左右子节点如果不为空会被加入到队列中
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)
        # 添加的时候注意方向
        ans.append(mList if leftToRight else mList[::-1])
        leftToRight = not leftToRight  # 下一步更改方向
    return ans


笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档


《征服数据结构》专栏

数组稀疏表(Sparse Table)单向链表双向链表块状链表跳表队列和循环队列双端队列单调队列单调栈双端栈散列表字典树(Trie树)ArrayMapSparseArray二叉树二叉搜索树(BST)笛卡尔树AVL树树堆(Treap)FHQ-Treap哈夫曼树滚动数组差分数组LRU缓存LFU缓存

……


《经典图论算法》专栏

图的介绍图的表示方式邻接矩阵转换广度优先搜索(BFS)深度优先搜索(DFS)A*搜索算法迭代深化深度优先搜索(IDDFS)IDA*算法双向广度优先搜索迪杰斯特拉算法(Dijkstra)贝尔曼-福特算法(Bellman-Ford)SPFA算法弗洛伊德算法(Floyd)卡恩(Kahn)算法基于DFS的拓扑排序约翰逊算法(Johnson)

……

数据结构和算法
王一博,《算法秘籍》作者,1000多页的pdf算法题我也已经整理完成,在公众号“数据结构和算法”中回复关键字“pdf”即可下载。
 最新文章