买卖股票的最好时机(三)&&矩阵最长递增路径&&矩阵乘法

148 阅读1分钟

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