这是我参与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。
解题思路
- 使用小根堆,每次从小根堆拿出一个元素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
解题思路
使用队列实现层序遍历
- 先加入根节点;
- 再依次加入根节点的左右儿子,也就是从左到右扩展第二层节点;
- 再依次从左到右扩展第三层节点;
- 依次类推
所以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;
}
}