Lexi's Leetcode solutions

Archive for July 14th, 2013

http://blog.unieagle.net/2012/09/16/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Acontainer-with-most-water/才会的。

之前想的都是两两配对,然后update water最大值。但是这样有一些白做了的pair: 比如(i, j1), (i, j2), (i, j3)如果i比这几个j都小,那么短板就是i,j再怎么变也没用(j再大也没用,j要变小就更没用了),所以应该变i。这样i, j从两头逼近,所以一开始的宽是最大的,然后i,j越靠越近,就是说宽在不断变小,所以这个时候就指着arr[i], arr[j]没准能特大然后overcome宽小的缺陷了。因为是i, j不能一样,所以两头逼近这个方法始于本题。

private int maxWater(int[] arr) {
int maxWater = 0;
int i = 0, j = arr.length - 1;
while (i < j) {
maxWater = updateMax(maxWater, arr, i, j);
if (arr[i] < arr[j])
i++;
else
j--;
}
return maxWater;
}

Tags: ,

思路:

  1. pre的第一个肯定是root
  2. 在in里找root出现的位置m,那in的current subarray的左边就是左子树,右边就是右子树
  3. 左子树left size大小是m – a
  4. 那么pre里面root之后的left size个就是pre里面的左子树,可以将它作为一个subarray开始下一层递归了
  5. pre里面root + leftsize之后的那一半(到q为止)就是pre里面的右子树,可以将它作为一个subarray开始下一层递归,返回作为root的右子树。
  6. 所以一共三个变量:
    • p the beginning of PRE’s current subarray (subtree)
    • q the end of PRE’s current subarray (subtree)
    • a the beginning of IN’s current subarray (subtree)
private TreeNode constructFromInAndPre(int[] PRE, int[] IN, int p, int q, int a) {
  if (p > q)
    return null;
  TreeNode root = new TreeNode(PRE[p]);
  int m = findIndex(PRE[p], IN); //the index of the current root in the IN order
  if (m < 0)
    System.out.println("not exist");
  int leftSize = m - a; //the left subtree of root's size
  root.left = constructFromInAndPre(PRE, IN, p + 1, p + leftSize, a);
  root.right = constructFromInAndPre(PRE, IN, p + leftSize + 1, q, m + 1);
  return root;
}
Tags:

Blog Stats

  • 222,875 hits
July 2013
M T W T F S S
1234567
891011121314
15161718192021
22232425262728
293031