LeetCode

100. 相同树

/**
 * 100. 相同的树
 */
public class IsSameTree {

    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p != null && q != null && p.val == q.val) {
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }
        return false;
    }

    class TreeNode {
        int val;
        private TreeNode left;
        private TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
}

101. 对称二叉树

/**
 * 101. 对称二叉树
 * 给定一个二叉树,检查它是否是镜像对称的。
 */
public class IsSymmetric {

    public boolean isSymmetric(TreeNode root) {
        return isMirror(root, root);
    }

    private boolean isMirror(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        return p.val == q.val && isMirror(p.left, q.right) && isMirror(p.right, q.left);
    }

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
}

104. 二叉树的最大深度

/**
 * 104. 二叉树的最大深度
 */
public class MaxDepth {

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

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
}

108. 将有序数组转化成二叉搜索树

/**
 * 108. 将有序数组转换为二叉搜索树
 */
public class SortedArrayToBST {

    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }
        return this.buildTree(nums, 0, nums.length-1);
    }

    private TreeNode buildTree(int[] nums, int l, int r) {
        if (l > r) {
            return null;
        }
        if (l == r) {
            return new TreeNode(nums[l]);
        }
       int mid = (l + r)/2;
       TreeNode root = new TreeNode(nums[mid]);
       root.left = buildTree(nums, 0, mid -1);
       root.right = buildTree(nums, mid + 1, r);
       return root;
    }

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
}

111. 二叉树最小深度

/**
 * leetcode 111-二叉树最小深度
 * 最小深度定义为根节点到最近叶子节点的深度
 * https://blog.csdn.net/u013115610/article/details/71252441
 */
public class MinDepth {

    public int minDepth(TreeNode root) {
        int leftDepth = 0;
        int rightDepth = 0;
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 1;
        }
        if (root.left != null) {
            leftDepth = minDepth(root.left);
        }else {
            leftDepth = Integer.MAX_VALUE;
        }
        if (root.right != null) {
            rightDepth = minDepth(root.right);
        }else {
            rightDepth = Integer.MAX_VALUE;
        }
        return Math.min(leftDepth, rightDepth) + 1;



    }

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
}

112. 路径总和

public class BinaryTreePaths {

    public List binaryTreePaths(TreeNode root) {
        List list = new ArrayList<>();
        String s = "";
        paths(root, list, s);
        return list;

    }

    /**
     *
     * @param root TreeNode
     * @param list 存放所有路径
     * @param s 某条路径
     */
    private void paths(TreeNode root, List list, String s) {
        if (root == null) {
            return;
        }
        s += root.val + " ";
        if (root.left == null && root.right == null) {
            list.add(s.trim().replace(" ", "->"));
        }
        if (root.left != null) {
            paths(root.left, list, s);
        }
        if (root.right != null) {
            paths(root.right, list, s);
        }
    }

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

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

559. N叉树的最大深度

package com.bill.algorithm.dfs;

import java.util.List;

/**
 * N 叉树的最大深度
 */
public class NTreeMaxDepth {

    public int nTreeMaxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        int depth = 0;
        for (Node node : root.children) {
            depth = Math.max(depth, nTreeMaxDepth(node));
        }
        return depth + 1;
    }


    class Node {
        int val;
        List children;

        public Node(int val, List children) {
            this.val = val;
            this.children = children;
        }
    }

}

35. 搜索插入位置

/**
 * 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
 * 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
 * 你可以假设数组中无重复元素。
 */
public class SearchInsert {

    public int searchInsert(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= target) {
                return i;
            }
        }
        return nums.length;
    }
}

69. x 的平方根

/**
 * 实现 int sqrt(int x) 函数。
 * 计算并返回 x 的平方根,其中 x 是非负整数。
 * 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
 */
public class MySqrt {


    public int mySqrt(int x) {
        int left = 1;
        int right = 46341; // <2^31-1 开方
        int mid = 0;
        if (x == 0) {
            return 0;
        }
        while (left 

349. 两个数组的交集

/**
 * 最简单的方案是用A数组的所有元素去匹配B数组的所有元素,如果两个数组的大小为n, 遍历的时间复杂度为O(n)。
 * 但是我们可以用hash函数或者hash表去解决问题。将数组A的hash 到hash表中。然后继续将数组B继续hash到hash表中,如果发生hash碰撞则统计+1,最后得出数组的交集。
 * 时间复杂度是hash所有元素的复杂度。
 */
public class InterSection {

    public int[] intersection(int[] nums1, int[] nums2) {
        Hashtable ht = new Hashtable();
        List tmpList = new ArrayList();
        for (int e : nums1) {
            ht.put(e, e);
        }
        for (int e : nums2) {
            if (ht.get(e) != null) {
                tmpList.add(e);
            }
        }
        int[] result = new int[tmpList.size()];
        int i = 0;
        for (Integer value : tmpList) {
            result[i] = value;
            i++;
        }
        return result;
    }
}

704. 二分查找

            int low = 0;
    int high = nums.length - 1;
    while (low <= high) {
        if (nums[(low + high)/2]  == target) {
            return (low + high) / 2;
        }else if (nums[(low + high) / 2] >= target) {
            high = (low + high) / 2 - 1;
        }else {
            low = (low + high) / 2 + 1;
        }
    }
    return -1;

你可能感兴趣的:(算法)