重建二叉树&&最长递增子序列&&求平方根

132 阅读1分钟

NC12 重建二叉树

题目链接

1、解题思路
  • 找到树根,然后二分就好了。
2、代码
import java.util.Arrays;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
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 {
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型一维数组 the array
     * @return int整型一维数组
     */
    public int[] LIS (int[] arr) {
        // write code here
        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 {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        // write code here
        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;
    }
}