《剑指offer—面试题47:礼物的最大值》

《剑指offer—面试题47:礼物的最大值》
注明:仅个人学习笔记
详细分析见书上笔记

public int getMaxValue_solution(int[] values, int rows, int cols)
{
if (values == null || rows <= 0 || cols <= 0)
{
return 0;
}

    int[][] maxValues = new int[rows][];//数组中坐标为(i,j)的元素,表示到达坐标为(i,j)的格子时,能拿到的礼物价值总和的最大值,保存了到达每行每列的每个点的值信息
    // int a = maxValues.length;
    // int b = maxValues[0].length;

    for (int i = 0; i < rows; i++)
    {
        maxValues[i] = new int[cols];
    }

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            int left = 0;
            int up = 0;

            if (i > 0)
                up = maxValues[i - 1][j];

            if (j > 0)
                left = maxValues[i][j - 1];

            maxValues[i][j] = max(left, up) + values[i * cols + j];
        }
    }

    int maxValue = maxValues[rows - 1][cols - 1];

    return maxValue;

}

private int max(int left, int up)
{

    if (left > up)
        return left;
    return up;
}

public static void main(String[] args)
{
    GetMaxValue47 g = new GetMaxValue47();

    int[] values = { 1, 10, 3, 8, 12, 2, 9, 6, 5, 7, 4, 11, 3, 7, 16, 5 };

    int maxValue = g.getMaxValue_solution(values, 4, 4);

    System.out.println(maxValue);//53
}

————————————————分割线—————————————————

在优化后,maxValues为cols长度的一维数组,每行遍历时,只保存到达当前行的某个点的最大值

public int getMaxValue_solution(int[] values, int rows, int cols)
{
if (values == null || rows <= 0 || cols <= 0)
{
return 0;
}

    int[] maxValues = new int[cols];//长度为cols的一维数组


    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            int left = 0;
            int up = 0;

            if (i > 0)
                up = maxValues[j];

            if (j > 0)
                left = maxValues[j - 1];

            maxValues[i][j] = max(left, up) + values[i * cols + j];
        }
    }

    int maxValue = maxValues[cols - 1];//直到,到最后一行的最后一个点即求的最大值

    return maxValue;

}

private int max(int left, int up)
{

    if (left > up)
        return left;
    return up;
}

public static void main(String[] args)
{
    GetMaxValue47 g = new GetMaxValue47();

    int[] values = { 1, 10, 3, 8, 12, 2, 9, 6, 5, 7, 4, 11, 3, 7, 16, 5 };

    int maxValue = g.getMaxValue_solution(values, 4, 4);

    System.out.println(maxValue);//53
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值