【LeetCode】Sama的个人记录_32

 

【Q110】(ez) 平衡二叉树
 
给定一个二叉树,判断它是否是高度平衡的二叉树。
 
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1
 
示例 :

给定二叉树 [3,9,20,null,null,15,7]

	  3   
     / \   
	 9  20
  	   /  \    
      15   7 

返回 true 。

class Solution {
    /**
     *【二叉树 + DFS】
     * 首先要对求二叉树高度的方法了如指掌:return Math.max(DFS(node.left), DFS(node.right)) + 1;
     * 
     * 这道题的关键与巧妙在于:返回值为-1时表示二叉树不平衡
     * 只要任何有个子节点返回了-1,就直接返回-1,不需要再计算高度
     */
    public boolean isBalanced(TreeNode root) {
        return DFS(root) >= 0;
    }

    private int DFS(TreeNode node){        // 返回的为c树的高度 或 -1
        if(node == null){
            return 0;
        }
        int left = DFS(node.left);
        int right  = DFS(node.right);
        if(Math.abs(left - right) >= 1 || left == -1 || right == -1){
            return -1;
        }
        return Math.max(left, right) + 1;
    }
}

 
 

【Q109】(md) 有序链表转换平衡二叉树
 
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
 
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
 
示例:

给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5]
它可以表示下面这个高度平衡二叉搜索树:

     0
    / \   
  -3   9   
  /   /  
-10  5
class Solution {
    /**
     * 代码思路:
     *     递归时把链表的中点作为根节点,最终构成的平衡二叉树的高度自然而然的符合要求(直观猜测,数学证明)
     *     那么递归代码不难写,难点在于找到链表的中点,然后切割链表————
     *          1.找中点:这里利用快慢指针的思想,慢指针一次走1,快指针一次走2,快指针到头时慢指针的位置即为中点
     *          2.切链表:用到了三个指针,q用作快指针,不做解释;因为这是单向链表,因此用了pre和p两个指针
     *
     */
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null){           // 子链表无节点的情况
            return null;
        }
        if(head.next == null){      // 子链表只有一个节点的情况
            return new TreeNode(head.val, null, null);
        }

        ListNode pre = head;
        ListNode p = head.next;
        ListNode q = head.next.next;

        while(q != null && q.next != null){
            pre = pre.next;
            p = pre.next;
            q = q.next.next;
        }

        TreeNode node = new TreeNode(p.val);
        pre.next = null;    // (♥)切割
        node.left = sortedListToBST(head);
        node.right = sortedListToBST(p.next);

        return node;
    }
}

// 注:这道题是将一个有序数组转化为二叉搜索树的进阶(leetcode_108)
// 核心是不断取中点作为根节点,不要受到(leetcode_110判定平衡二叉树的影响)

 
 

【Q110】(md) 回文子串
 
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串
 
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
 
示例 1:
输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
 
示例 2:
输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

class Solution {
   /*
	*【动态规划】
	* 很常规的题目————字符串类型的题目,应该立即想到二维dp
	* 空间的压缩也很常规,这里不再给出代码
	*/
    public int countSubstrings(String s) {
        int res = 0;
        int len = s.length();
        boolean[][] dp = new boolean[len][len];

        for(int j = 0; j < len; j++){
            for(int i = 0; i <= j; i++){
                if(i == j){
                    dp[i][j] = true;
                }else if(i + 1 == j && s.charAt(i) == s.charAt(j)){
                    dp[i][j] = true;
                }else{
                    dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
                }
                if(dp[i][j]){
                    res++;
                }
            }
        }

        return res;
    }
}

 
 

 

 

 

 

 

 

 

 

 
 

 

 

Qs from https://leetcode-cn.com
♥ loli suki
♠ end

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