经典题的经典解法总结

Posted by 大雁小鱼的博客 on May 26, 2018

经典题的经典解法总结

背景

我见过许多优秀的题目的经典解法,很是佩服,同时也提高了自己的知识水平。这些解法的特点是简单,有些已经到了减无可减的地步。 我个人认为,对于这种,我们只能膜拜 + 硬背了,本篇博客就打算整理这些经典题的经典解法,以供大家学习。

第一题 求二叉树的高度

// 时间复杂度O(n),空间复杂度O(logn)
class Solution {
  int maxDepth(TreeNode root) {
    if (root == null) return 0;
    return max(maxDepth(root.left), maxDepth(root.right)) + 1;
  }
};

第二题 判断二叉树是否镜像对称

// 递归版,时间复杂度O(n),空间复杂度O(logn)
class Solution {

  bool isSymmetric(TreeNode root) {
    return root ? isSymmetric(root.left, root.right) : true;
  }
  bool isSymmetric(TreeNode left, TreeNode right) {
    if (!left && !right) return true; // 终止条件
    if (!left || !right) return false; // 终止条件
    return left.val == right.val // 三方合并
    && isSymmetric(left.left, right.right)
    && isSymmetric(left.right, right.left);
  }
};

第三题 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次外,其余每个元素均出现两次,找出那个只出现一次的元素

// 时间复杂度O(n),空间复杂度O(1)
class Solution {
  int singleNumber(int A[], int n) {
    int x = 0;
    for (int i = 0; i < n; ++i)
      x ^= A[i];
    return x;
  }
};