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;
}
}
}