LC面试题 17.14. 最小K个数
//使用大根堆
class Solution {
public int[] smallestK(int[] arr, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>((v1,v2) ->v2 - v1);
for(int a : arr){
heap.offer(a);
if(heap.size() > k){
heap.poll();
}
}
int[] res = new int[k];
for(int i = 0;i < k;i++){
res[i] = heap.poll();
}
return res;
}
}
LC236. 二叉树的最近公共祖先
//递归做法,已经忘记如何写了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//如果root为空返回root,如果为p或q则返回p或q即可为公共节点
if(root == null || root == p || root == q)
return root;
//保存左子树
TreeNode left = lowestCommonAncestor(root.left,p,q);
//保存右子树
TreeNode right = lowestCommonAncestor(root.right,p,q);
//如果左树为空,那么pq公共祖先在右树
if(left == null) return right;
//如果右树为空,那么pq公共祖先在左树
if(right == null) return left;
//如果都不为空那么pq公共祖先就是root
return root;
}
}
LC235. 二叉搜索树的最近公共祖先
//利用二叉搜索树的性质,和上面的有点类似,就是需要判断左小右大,因为题目已经说了公共节点一定存在那么,只要找到就可以返回根本不会递归到叶子节点的null值就返回了。所以直接return递归函数即可,存在三种情况,pq都小于根节点,pq都大于根节点,pq一左一右或者自己就是根节点。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
/**
* @Author biggerman
* 二叉搜索树特性:左子树比根节点小,右子树比根节点大
* 三种情况
* 第一种:p,q均在root的右子树
* 第二种:p,q均在root的左子树
* 第三种:,最近祖先只能是root
**/
// 第一种情况,p和q都在右子树,应该把视角放在右边,去右子树找第三种情况
if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right, p, q);
}
// 第二种情况,p和q都在左子树,应该把视角放在左边,去左子树找第三种情况
if(root.val>p.val&&root.val>q.val){
return lowestCommonAncestor(root.left, p, q);
}
// 第三种情况,p,q不在同一子树,只能是p,q分别在一左一右,或者,p,q其中一个是根节点,都返回root
return root;
}
}