NC12 重建二叉树
题目链接
1、解题思路
2、代码
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if (pre == null || pre.length == 0) {
return null;
} else if (pre.length == 1) {
return new TreeNode(pre[0]);
} else {
int index = -1;
for (int i = 0; i < vin.length; i++) {
if (vin[i] == pre[0]) {
index = i;
break;
}
}
int len = index;
TreeNode node = new TreeNode(pre[0]);
node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, index + 1), Arrays.copyOfRange(vin, 0, index));
node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, index + 1, pre.length), Arrays.copyOfRange(vin, index + 1, vin.length));
return node;
}
}
}
NC91 最长递增子序列
题目链接
1、解题思路
- 这个题目需要求具体的数组,我们需要二分插入之外,需要求具体每个下标对应的最大递增子序列的长度是多少,放在list中。然后根据从后往前遍历list,找到最大递增子序列长度依次递减的下标,然后到arr中取数。
2、代码
import java.util.*;
public class Solution {
public int[] LIS (int[] arr) {
ArrayList<Integer> len = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
list.add(arr[0]);
len.add(1);
for (int i = 1; i < arr.length; i++) {
if (arr[i] > list.get(list.size() - 1)) {
list.add(arr[i]);
len.add(list.size());
} else {
int index = Arrays.binarySearch(list.toArray(), arr[i]);
if (index < 0) {
index = (index + 1) * (-1);
list.set(index, arr[i]);
}
len.add(index + 1);
}
}
int[] ret = new int[list.size()];
int i = len.size() - 1;
for (int j = list.size() - 1; j >= 0; j--) {
while (len.get(i) != j+1) {
i--;
}
ret[j] = arr[i];
}
return ret;
}
}
NC32 求平方根
题目链接
1、解题思路
- 二分就好了,代码是一个固定的二分模板,可以放心使用。
2、代码
import java.util.*;
public class Solution {
public int sqrt (int x) {
long l = 1;
long r = x;
long ret = 0;
while (l <= r) {
long mid = l + (r - l) / 2;
if (mid * mid <= x) {
ret = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return (int) ret;
}
}