您当前的位置: 首页 >  面试

庄小焱

暂无认证

  • 1浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

牛客网算法——名企高频面试题143题(3)

庄小焱 发布时间:2020-12-08 19:12:02 ,浏览量:1

给定一棵树,求出这棵树的直径,即树上最远两点的距离。示例1的树如下图所示。其中4到5之间的路径最长,是树的直径,距离为5+2+4=11

543. 二叉树的直径

package 复现代码;

/**
 * @Classname 二叉树的直径
 * @Description TODO
 * @Date 2020/12/8 16:09
 * @Created by xjl
 */
public class 二叉树的直径 {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    //表示二叉数据的直径
    int dis = 1;

    /**
     * @description TODO 表示的是的二叉树的直径
     * @param: root
     * @date: 2020/12/8 16:10
     * @return: int
     * @author: xjl
     */
    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        deepth(root);
        return dis - 1;
    }

    private int deepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = deepth(root.left);
        int right = deepth(root.right);
        dis = Math.max(dis, left + right + 1);
        return Math.max(left, right) + 1;
    }

}

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

package 复现代码;

/**
 * @Classname 二叉树的直径
 * @Description TODO
 * @Date 2020/12/8 16:09
 * @Created by xjl
 */
public class 二叉树的直径 {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    //表示二叉数据的直径 表示的是如果存在话至少1的
    int dis = 1;

    /**
     * @description TODO 表示的是的二叉树的直径
     * @param: root
     * @date: 2020/12/8 16:10
     * @return: int
     * @author: xjl
     */
    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        deepth(root);
        return dis-1;
    }

    private int deepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = deepth(root.left);
        int right = deepth(root.right);
        dis = Math.max(dis, left + right + 1);
        return Math.max(left, right) + 1;
    }
}
题目描述

有一个源源不断的吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个名叫MedianHolder的结构,MedianHolder可以随时取得之前吐出所有数的中位数。 [要求] 1. 如果MedianHolder已经保存了吐出的N个数,那么将一个新数加入到MedianHolder的过程,其时间复杂度是O(logN)。

2. 取得已经吐出的N个数整体的中位数的过程,时间复杂度为O(1)

 

每行有一个整数opt表示操作类型

若opt=1,则接下来有一个整数N表示将N加入到结构中。 若opt=2,则表示询问当前所有数的中位数

package 名企高频面试题143;

import org.junit.Test;

import java.util.*;

/**
 * @Classname 随机找到数据流中位数
 * @Description TODO
 * @Date 2020/12/8 16:30
 * @Created by xjl
 */
public class 随机找到数据流中位数 {

    public double[] flowmedian(int[][] operations) {
        ArrayList result = new ArrayList();
        ArrayList list = new ArrayList();
        for (int[] arr : operations) {
            if (arr[0] == 1) {
                //存元素
                list.add(arr[1]);
            } else {
                Collections.sort(list);
                if (list.size() == 0) {
                    result.add((double) -1);
                    continue;
                }
                if (list.size() % 2 != 0) {
                    result.add((double) list.get(list.size() / 2));
                } else {
                    result.add((double) (list.get(list.size() / 2 - 1) + list.get(list.size() / 2)) / 2);
                }
            }
        }
        return result.stream().mapToDouble(Double::valueOf).toArray();
    }

    @Test
    public void test() {
        //{{1, 5}, {2}, {1, 3}, {2}, {1, 6}, {2}, {1, 7}, {2}}  {{2}, {1, 1}, {2}}
        double[] flowmedian = flowmedian1(new int[][]{{1, 5}, {2}, {1, 3}, {2}, {1, 6}, {2}, {1, 7}, {2}});
        for (double a : flowmedian) {
            System.out.println(a);
        }
    }

    /**
     * @description TODO 采用的是大跟堆和小根堆
     * @param: operations
     * @date: 2020/12/8 19:04
     * @return: double[]
     * @author: xjl
     */
    public double[] flowmedian1(int[][] operations) {
        int sum = 0;
        PriorityQueue queMax = new PriorityQueue((o1, o2) -> {
            return o2 - o1;
        });
        PriorityQueue queMin = new PriorityQueue((o1, o2) -> (o1 - o2));
        List resD = new ArrayList();

        for (int i = 0; i < operations.length; i++) {
            if (operations[i][0] == 1) {
                //插入
                int number = operations[i][1];
                sum++;
                queMax.add(number);
                queMin.add(queMax.poll());
                if (sum % 2 == 1) {
                    queMax.add(queMin.poll());
                }
            } else {
                //查找
                if (sum == 0) {
                    resD.add((double) -1);
                } else {
                    if (sum % 2 == 1) {
                        //res.add((double)-1);
                        double dt = queMax.peek();
                        resD.add(dt);
                    } else {
                        //res.add(getMidNum(temD));
                        double dt = (queMax.peek() + queMin.peek()) / 2.0;
                        resD.add(dt);
                    }
                }

            }
        }
        double[] res = new double[resD.size()];
        for (int i = 0; i < resD.size(); i++) {
            res[i] = resD.get(i);
        }
        return res;
    }
}

 

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0377s