最长重复子串&&不相邻最大子序列和&&将升序数组转化为平衡二叉树

361 阅读1分钟

NC142 最长重复子串

题目链接

1、解题思路

类似于那个区间dp,外层的是gap,一旦发现较大gap满足了,就直接返回。所以,gap的值可以从n/2 枚举到1。

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a string字符串 待计算字符串
     * @return int整型
     */
    public int solve (String a) {
        char[] chars = a.toCharArray();
        int n = a.length();
        int res = 0;
        int cnt = 0;
        for (int i = n / 2; i > 0; i--) {
            for (int j = 0; j < n - i; j++) {
                if (chars[j] == chars[i + j]) {
                    cnt++;
                } else {
                    cnt = 0;
                }
                if (cnt == i) {
                    res = 2 * i;
                    return res;
                }
            }
        }
        return 0;
    }
}

NC144 不相邻最大子序列和

题目链接

1、解题思路

dp,注意存在负数的情况。

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算
     * @param n int整型 数组的长度
     * @param array int整型一维数组 长度为n的数组
     * @return long长整型
     */
    public long subsequence (int n, int[] array) {
        long ans = 0;
        if (n == 1) {
            return array[0] > 0 ? array[0] : 0;
        } else if (n == 2) {
            long val = Math.max(array[0], array[1]);
            return val >= 0 ? val : 0;
        } else {
            long[] dp = new long[n];
            dp[0] = Math.max(dp[0], array[0]);
            if (ans < dp[0]) {
                ans = dp[0];
            }
            dp[1] = Math.max(array[1], array[0]);
            if (ans < dp[1]) {
                ans = dp[1];
            }
            for (int i = 2; i < array.length; i++) {
                long val1 = array[i];
                long val2 = array[i] + dp[i - 2];
                long val3 = dp[i - 1];
                dp[i] = Math.max(Math.max(val1, val2), val3);
                if (ans < dp[i]) {
                    ans = dp[i];
                }
            }
        }
        return ans;
    }
}

NC11 将升序数组转化为平衡二叉树

题目链接

1、解题思路

递归+二分求解,中间的当树根,然后左右两部分进行二分。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param num int整型一维数组 
     * @return TreeNode类
     */
    public TreeNode sortedArrayToBST (int[] num) {
        if (num.length == 0) {
            return null;
        } else if (num.length == 1) {
            return new TreeNode(num[0]);
        } else {
            int mid = (0 + num.length) / 2;
            TreeNode root = new TreeNode(num[mid]);
            root.left = sortedArrayToBST(Arrays.copyOfRange(num, 0, mid));
            root.right = sortedArrayToBST(Arrays.copyOfRange(num, mid + 1, num.length));
            return root;
        }
    }
}