剑指 Offer 41. 数据流中的中位数 剑指 Offer 55 - I. 二叉树的深度 剑指 Offer 55 - II. 平衡二叉树 剑指 Offer 64. 求1+2+…+n

剑指 Offer 41. 数据流中的中位数

方法一:借用list集合来解决问题

class MedianFinder {
    List<Integer> res;

    /** initialize your data structure here. */
    public MedianFinder() {
        res=new ArrayList<>();
        
    }
    
    public void addNum(int num) {
        res.add(num);

    }
    
    // 1 2 3 4 5 6
    public double findMedian() {
        //对list集合进行排序
        Collections.sort(res);
        if(res.size()%2==0){
         
          double zw=(res.get(res.size()/2-1)+res.get(res.size()/2))/2.0;
                return zw;

        }else{
            // 1 2 3 4 5
            double zw=res.get(res.size()/2)*1.0;
            return zw;
        }

    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

方法二:
借用大顶堆和小顶堆

class MedianFinder {
    Queue<Integer> A,B;

    /** initialize your data structure here. */
    public MedianFinder() {
        A=new PriorityQueue<>(); //小顶堆,保存较大的一半
        B=new PriorityQueue<>((x,y) -> (y-x));//大顶堆,保存较小的一半
     
    }
    
    //当两堆的数据个数相等时候,左边堆添加元素。
    // 采用的方法不是直接将数据插入左边堆,而是将数据先插入右边堆,算法调整后
     //     将堆顶的数据插入到左边堆,这样保证左边堆插入的元素始终是右边堆的最小值。
       //  同理左边数据多,往右边堆添加数据的时候,先将数据放入左边堆,选出最大值放到右边堆中。
    public void addNum(int num) {
        if(A.size()==B.size()){
            A.add(num);
            B.add(A.poll());
        }else{
            B.add(num);
            A.add(B.poll());
        }

    }
    
    public double findMedian() {
        if(A.size()==B.size()){
            double res=(A.peek()+B.peek())/2.0;
            return res;
        }else{
            return (double)(B.peek());
        }

    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

剑指 Offer 55 - I. 二叉树的深度

方法一:层序遍历实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        int count=0;
        if(root==null) return 0;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int n=queue.size();
            count++;
            while(n!=0){
                n--;
                TreeNode temp = queue.poll();
                if(temp.left!=null) queue.offer(temp.left);
                if(temp.right!=null) queue.offer(temp.right);
            }
        }
    return count;
    }
}

方法二:递归法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
       if(root==null) return 0;
       else{
           //关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1
           return Math.max(maxDepth(root.left)+1,maxDepth(root.right)+1);
       }
    }
}

剑指 Offer 55 - II. 平衡二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null) return true;
        else{
           return Math.abs(count(root.left)-count(root.right))<=1 && isBalanced(root.left) && isBalanced(root.right);
        }
        

    }
    public int count(TreeNode root){
        if(root==null) return 0;
        else{
            return Math.max(count(root.left),count(root.right))+1;
        }
    }
}

剑指 Offer 64. 求1+2+…+n

思路:短路效应实现递归

class Solution {
    int res=0;
    public int sumNums(int n) {
        //思路:本题实现 “当 n = 1时终止递归” 的需求,可通过短路效应实现
        boolean x=n>1&&sumNums(n-1)>0;
        res+=n;
       return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值