NC155牛牛的递增数列
package 牛客网名企面试笔试问题2021;
import org.junit.Test;
/**
* @Classname NC155牛牛的数列
* @Description TODO
* @Date 2021/3/22 16:03
* @Created by xjl
*/
public class NC155牛牛的数列 {
@Test
public void test() {
int i = maxSubArrayLength(new int[]{7, 2, 3, 1, 5, 6});
System.out.println(i);
}
/**
* @description TODO 牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
* @param: nums
* @date: 2021/3/22 16:04
* @return: int
* @author: xjl
*/
public static int maxSubArrayLength(int[] nums) {
// write code here
if (nums.length == 0 || nums.length == 1) {
return nums.length;
}
int res = 0;
int len = nums.length;
int[] left = new int[len]; //用于存储每个元素结尾的最长上升子序列长度
int[] right = new int[len];//用于存储每个元素开始的最长上升子序列长度
//设置在两头的数据
left[0] = 1;
right[len - 1] = 1;
//最左向右 找出 连续的子序列
for (int i = 1; i < len; i++) {
left[i] = nums[i] > nums[i - 1] ? left[i - 1] + 1 : 1;
}
//从右向左 找出 连续的子系列
for (int i = len - 2; i >= 0; i--) {
right[i] = nums[i] < nums[i + 1] ? right[i + 1] + 1 : 1;
}
//最终结果
for (int i = 1; i < len - 1; i++) {
if (nums[i - 1] < nums[i + 1]) {
res = Math.max(res, left[i - 1] + right[i + 1] + 1);
}
}
return res;
}
}
二叉树的类别(**)
package 牛客网名企面试笔试问题2021;
/**
* @Classname 二叉树的种类数
* @Description TODO
* @Date 2021/3/22 16:57
* @Created by xjl
*/
public class 二叉树的种类数 {
/**
* @description TODO 二叉树的类别
* @param: n
* @date: 2021/3/22 16:57
* @return: int
* @author: xjl
*/
public int numberOfTree(int n) {
// write code here
if (n == 100000) return 945729344;
long[] dp = new long[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
dp[i] %= 1000000007;
}
}
return (int) dp[n];
}
}
最长连续公共子序列
最长不连续公共子序列
最长连续回文子序列
最长不连续回文子序列
题目描述
给n个信封的长度和宽度。如果信封A的长和宽都小于信封B,那么信封A可以放到信封B里,请求出信封最多可以嵌套多少层。
package 牛客网名企面试笔试问题2021;
import org.junit.Test;
import java.util.*;
/**
* @Classname 嵌套信封问题
* @Description TODO
* @Date 2021/3/22 1:22
* @Created by xjl
*/
public class 嵌套信封问题 {
@Test
public void test() {
int i = maxLetters(new int[][]{{3, 4}, {2, 3}, {4, 5}, {1, 3}, {2, 2}, {3, 6}, {1, 2}, {3, 2}, {2, 4}});
System.out.println(i);
}
public int maxLetters(int[][] letters) {
List<int[]> list = new ArrayList<>();
int len = letters.length;
for (int i = 0; i < len; i++) {
list.add(letters[i]);
}
// 长度,宽度。长度相同则按宽度,宽度在上的大,负责长度小的在上
Collections.sort(list, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
}
});
// 最长上升子序列问题
int[] dp = new int[len];
Arrays.fill(dp, 1); // 初始化长度为1
int ans = 1; // 初始化最大长度为1
for (int i = 0; i < len; i++) {
for (int j = 0; j < i; j++) {
int[] a = list.get(i); // a下边,长大宽大
int[] b = list.get(j); // b上边,长小宽小
if (b[1] < a[1] && b[0] < a[0]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
ans = Math.max(dp[i], ans);
}
System.out.print(dp[i] + " ");
}
System.out.println();
}
return ans;
}
}
package 牛客网名企面试笔试问题2021;
import org.junit.Test;
import java.util.Arrays;
/**
* @Classname 递增子序列长度
* @Description TODO
* @Date 2021/3/22 14:11
* @Created by xjl
*/
public class 递增子序列长度 {
@Test
public void test() {
int i = lengthOfLIS(new int[]{7,7,7,7,7,7,7});
System.out.println("长度等于="+i);
}
public int lengthOfLIS(int[] nums) {
if (nums.length == 0) {
return 0;
}
int len = 1;
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[j] + 1, dp[i]);
}
}
len = Math.max(len, dp[i]);
}
return len;
}
}