NC135 买卖股票的最好时机(三)
1、解题思路
二维dp的压缩,好吧,这个题目其实我也不太会,写多了就会了。
2、代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 两次交易所能获得的最大收益
* @param prices int整型一维数组 股票每一天的价格
* @return int整型
*/
public int maxProfit (int[] prices) {
int fstBuy = Integer.MIN_VALUE, fstSell = 0;
int secBuy = Integer.MIN_VALUE, secSell = 0;
for (int price : prices) {
fstBuy = Math.max(fstBuy, -1 * price);
fstSell = Math.max(fstSell, price + fstBuy);
secBuy = Math.max(fstSell - price, secBuy);
secSell = Math.max(secSell, secBuy + price);
}
return secSell;
}
}
NC138 矩阵最长递增路径
1、解题思路
深搜问题,注意判断越界。
2、代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 递增路径的最大长度
* @param matrix int整型二维数组 描述矩阵的每个数
* @return int整型
*/
private int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public int solve(int[][] matrix) {
int ans = 1;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
ans = Math.max(ans, dfs(i, j, matrix));
}
}
return ans;
}
private int dfs(int i, int j, int[][] matrix) {
int ret = 1;
int cur = 0;
for (int k = 0; k < 4; k++) {
int ii = i + dirs[k][0];
int jj = j + dirs[k][1];
if (ii < 0 || ii >= matrix.length) {
continue;
}
if (jj < 0 || jj >= matrix[0].length) {
continue;
}
if (matrix[ii][jj] <= matrix[i][j]) {
continue;
}
cur = Math.max(cur, dfs(ii, jj, matrix));
}
return ret + cur;
}
}
NC143 矩阵乘法
1、解题思路
矩阵乘法的模拟
2、代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型二维数组 第一个矩阵
* @param b int整型二维数组 第二个矩阵
* @return int整型二维数组
*/
public int[][] solve (int[][] a, int[][] b) {
int n = a.length;
int[][] matrix = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// a的第i行 乘b的第j列
int sum = 0;
for (int k = 0; k < n; k++) {
sum = sum + a[i][k] * b[k][j];
}
matrix[i][j] = sum;
}
}
return matrix;
}
}