第38天--算法(Leetcode 662优化解法,297,300)
662. 二叉树最大宽度(优化解法,防止正常标记的id数超过int范围(全是右子树))
List<Integer> ls = new ArrayList<>(); // 记录每一层的最左节点初始id
public int widthOfBinaryTree(TreeNode root) {
return process(root,0,0);
}
//d表示第几层,id表示初始id
public int process(TreeNode root,int d,int id) {
if(root == null) {
return 0;
}
if(ls.size() == d) {
ls.add(id);
}
id = id - ls.get(d);
return Math.max(id + 1,Math.max(process(root.left,d + 1,id * 2),process(root.right,d + 1,id * 2 + 1)));
}
297.二叉树的序列化与反序列化
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
LinkedList<String> ans = new LinkedList<>();
if(root == null) {
ans.add(null);
}else {
ans.add(String.valueOf(root.val));
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
if(temp.left != null) {
ans.add(String.valueOf(temp.left.val));
queue.add(temp.left);
}else {
ans.add(null);
}
if(temp.right != null) {
ans.add(String.valueOf(temp.right.val));
queue.add(temp.right);
}else {
ans.add(null);
}
}
}
while(!ans.isEmpty() && ans.peekLast() == null) {
ans.pollLast();
}
StringBuilder sb = new StringBuilder();
sb.append("[");
String first = ans.pollFirst();
sb.append(first == null ? "null" : first);
while(!ans.isEmpty()) {
String temp = ans.pollFirst();
sb.append("," + (temp == null ? "null" : temp));
}
sb.append("]");
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String str[] = data.substring(1,data.length() - 1).split(",");
int index = 0;
TreeNode res = generateNode(str[index ++]);
Queue<TreeNode> queue = new LinkedList<>();
if(res != null) {
queue.add(res);
}
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
temp.left = generateNode(index == str.length ? "null" : str[index ++]);
temp.right = generateNode(index == str.length ? "null" : str[index ++]);
if(temp.left != null) {
queue.add(temp.left);
}
if(temp.right != null) {
queue.add(temp.right);
}
}
return res;
}
public TreeNode generateNode(String s) {
if(s.equals("null")) {
return null;
}
return new TreeNode(Integer.valueOf(s));
}
300. 最长递增子序列(O(nlogn))
public int lengthOfLIS(int[] nums) {
List<Integer> ls = new ArrayList<>();
ls.add(nums[0]);
for(int i = 1;i < nums.length;i ++) {
int x = f(ls,nums[i]);
if(x == -1) {
ls.set(0,Math.min(ls.get(0),nums[i]));
}else {
if(x + 1 == ls.size()) {
ls.add(nums[i]);
}else {
ls.set(x + 1,Math.min(ls.get(x + 1),nums[i]));
}
}
}
return ls.size();
}
//返回 < target最右
public int f(List<Integer> ls,int target) {
int L = 0;
int R = ls.size() - 1;
int ans = -1;
int M = 0;
while(L <= R) {
M = (L + R) >> 1;
if(ls.get(M) >= target) {
R = M - 1;
}else {
ans = M;
L = M + 1;
}
}
return ans;
}