剑指 Offer 32 - I. 从上到下打印二叉树 AND 剑指 Offer 49. 丑数

180 阅读1分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明:

  • 1 是丑数。
  • n 不超过1690。

解题思路

  1. 使用小根堆,每次从小根堆拿出一个元素cur,并且将cur *2,cur *3,cur *5加入小根堆,当第n次从小根堆出队的元素就是第n个丑数

优先队列算法的时间复杂度为O(n*log(M)), M为优先队列的平均长度, 这个例子里面, 当n = 1670时, 优先队列的长度为162(因为大部分合数的最小质因子是2, 每次迭代只push了一个合数, 而每次迭代会pop一个合数, 因此, 优先队列的长度增长的比较慢), 平均长度会更小. 因此, 优先队列算法的时间复杂度接近于O(n)

代码

class Solution {
    public int nthUglyNumber(int n) {


        PriorityQueue<Long> priorityQueue=new PriorityQueue<>();
        HashSet<Long> hashSet=new HashSet<>();
        priorityQueue.add(1L);
        hashSet.add(1L);
        for (int i=0;i<n-1;i++)
        {
            long cur = priorityQueue.poll();
            if (!hashSet.contains(cur*2))
            {
                hashSet.add(cur*2);
                priorityQueue.add(cur*2);
            }
            if (!hashSet.contains(cur*3))
            {
                hashSet.add(cur*3);
                priorityQueue.add(cur*3);
            }
            if (!hashSet.contains(cur*5))
            {
                hashSet.add(cur*5);
                priorityQueue.add(cur*5);
            }
        }
        return (int)priorityQueue.poll().longValue();

    }
}

剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如: 给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

提示:

节点总数 <= 1000

解题思路

使用队列实现层序遍历

  1. 先加入根节点;
  2. 再依次加入根节点的左右儿子,也就是从左到右扩展第二层节点;
  3. 再依次从左到右扩展第三层节点;
  4. 依次类推

所以BFS的顺序就是这道题目要求的顺序。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] levelOrder(TreeNode root) {

  
        List<Integer> res=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
 
        if(root==null) return new int[0];
        queue.add(root);
        while(!queue.isEmpty())
        {
            int size=queue.size();
            for(int i=0;i<size;i++)
            {
                 TreeNode cur=queue.poll();
                 res.add(cur.val);
                 if(cur.left!=null) queue.add(cur.left);
                if(cur.right!=null) queue.add(cur.right);
            }
        }
               int[] ret=new int[res.size()];
        for(int i=0;i<res.size();i++)
        {
           ret[i]=res.get(i);
        }
        return ret;
    }
}