Lexi's Leetcode solutions

Archive for October 7th, 2013

经典题,注意balanced的定义:左右子树都balance,且高度差<=1。所以下面这个也是balanced的,即使a的做右子树都不是完全树。

    a
   / \ 
  b   d
 /     \
c       e

唯一的trick:不用生成新的data structure来保存“boolean isBalanced, int height”,直接用height = -1表示不平衡就行。

public boolean isBalanced(TreeNode root) {
  return getHeight(root) >= 0;
}
private int getHeight(TreeNode root) {
  if (root == null)
    return 0;
  int leftHeight = getHeight(root.left);
  if (leftHeight < 0)
    return -1;
  int rightHeight = getHeight(root.right);
  if (rightHeight < 0)
    return -1;
  if (Math.abs(leftHeight - rightHeight) > 1)
    return -1;
  return Math.max(leftHeight, rightHeight) + 1;
}
Tags: , ,

bit好久没看真是全尼玛忘了。那些最基本的:

  • 显现a的第i位: a & 1 << i
  • 把a的第i位置零:a &= ~(1 << i)
  • 把result给populate回来:result |= 1 << i

创建一个长度为32的数组a,a[i]表示所有数字在i位出现的次数。假如a[i]是3的整数倍,则忽略;否则就把该位取出来组成答案。空间复杂度O(1).

public int singleNumber(int[] A) {
    int[] bv = new int[32];
    for (int i = 0; i < A.length; i++) {
        for (int j = 0; j < 32; j++) {
            bv[j] += (A[i] & (1 << j)) == 0 ? 0 : 1;
        }
    }
    int res = 0;
    for (int i = 0; i < 32; i++) {
        if (bv[i] % 3 != 0) {
            res |= 1 << i;
        }
    }
    return res;
}
Tags: , ,