1. 最小路径
[ [2], [3,4], [6,1,8] ] minPath=2+3+1
public int minimumTotal(List<List<Integer>> triangle){
for (int i = triangle.size()-2; i >=0 ; --i) {
for (int j = 0; j <i+1 ; j++) {
int old=triangle.get(i).get(j);
triangle.get(i).set(j, old+Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1)));
}
}
return triangle.get(0).get(0);
}
2.最大连续子数组
[−2,1,−3,4,−1,2,1,−5,4] [4,−1,2,1] sum = 6 .
public int minimumTotal(List<List<Integer>> triangle){
for (int i = triangle.size()-2; i >=0 ; --i) {
for (int j = 0; j <i+1 ; j++) {
int old=triangle.get(i).get(j);
triangle.get(i).set(j, old+Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1)));
}
}
return triangle.get(0).get(0);
}
3.最大连续子数组乘积
public static int maxProduct(int[] nums){
int maxLocal=nums[0];
int minLocal=nums[0];
int global=nums[0];
for (int i = 1; i <nums.length ; i++) {
int tem=maxLocal;
maxLocal=Math.max(Math.max(nums[i]*maxLocal,nums[i]),nums[i]*minLocal);
minLocal=Math.min(Math.min(nums[i]*tem,nums[i]),nums[i]*minLocal);
global=Math.max(global,maxLocal);
}
return global;
}
4.最长连续递增子序列
public static int lengthOfLIS(int[] nums){
if(nums==null||nums.length==0)return 0;
int[] f=new int[nums.length];
Arrays.fill(f,1);
int global=1;
for (int j = 1; j < nums.length; j++) {
for (int i = 0; i <j ; i++) {
if(nums[i]<nums[j]){
f[j]=Math.max(f[j],f[j]+1);
}
}
global=Math.max(global,f[j]);
}
return global;
}
5.字符串中回文串的最小切割数
public static int minCut(String s){
final int n=s.length();
int[] f=new int[n+1];
boolean[][] p=new boolean[n][n];
for (int i = 0; i <n ; i++) {
for (int j = i; j <n ; j++) {
if(s.charAt(i)==s.charAt(j)&&(j-i<2||p[i+1][j-1])){
p[i][j]=true;
f[i]=Math.min(f[i],f[j+1]+1);
}
}
}
return f[0];
}