- 两个数组最长公共子数组
public static void main(String[] args) {
int[] arr1={3,4576,768,3,35,68,7,43};
int[] arr2={54,67,3,3,768,3,35,564};
int m=arr1.length;
int n=arr2.length;
int[][] dp=new int[m][n];
int start=0;
int end=0;
int maxlen=0;
for (int i = 1; i <=m ; i++) {
for (int j = 1; j <=n ; j++) {
if(arr1[i-1]==arr2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>maxlen){
maxlen=dp[i][j];
start=i-maxlen;
end=i;
}
}
}
}
List<Integer> res=new ArrayList<>();
for(int i=start;i<end;i++){
res.add(arr1[i]);
}
System.out.println(res);
}
- 两个数组最长公共子序列长度
public static void main(String[] args) {
int[] arr1={1,9999,777777,3,8888888,5,7,9,33333333};
int[] arr2={12,334,456,87,1,3,5,456,7,9,435,12};
int m=arr1.length;
int n=arr2.length;
int[][] dp=new int[m+1][n+1];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(arr1[i-1]==arr2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
System.out.println(dp[m][n]);
}
- 连续子数组之和最大值
public int maxSubArray(int[] nums) {
if(nums.length==0){
return 0;
}
int sum=0;
int res=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
sum=Math.max(sum+nums[i],nums[i]);
res=Math.max(res,sum);
}
return res;
}
- 连续子数组乘积最大值
int m=nums.length;
if(m==0){
return 0;
}
int max=nums[0];
int min=nums[0];
int res=nums[0];
for(int i=1;i<m;i++){
if(nums[i]<0){
int tmp=max;
max=min;
min=tmp;
}
max=Math.max(max*nums[i],nums[i]);
min=Math.min(min*nums[i],nums[i]);
res=Math.max(res,max);
}
return res;
}
- 最长上升子序列
public int lengthOfLIS(int[] nums) {
int n=nums.length;
if(n==0){
return 0;
}
int[] dp=new int[n];
Arrays.fill(dp,1);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
}
int res=0;
for(int i=0;i<n;i++){
res=Math.max(res,dp[i]);
}
return res;
}