Day48代码随想录 动态规划

发布于:2024-04-26 ⋅ 阅读:(14) ⋅ 点赞:(0)

337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

状态:看题解思路完成了,自己想没想到返回值是二维

思路:这题用后序遍历顺序,因为可以从后向前遍历,后序遍历的返回值是一个长度为2的一维数组,下标0是不取当前节点的最大值,下标1是取当前节点的最大值,这里有个点就是不取这个点时并不是左右都要取的要比较取大点还是不取大点。

class Solution {
    public int rob(TreeNode root) {
        int[] arr=backtracking(root);
        return Math.max(arr[0],arr[1]);
    }
    public int[] backtracking(TreeNode root){
        if(root==null) return new int[]{0,0};
        int[] left =backtracking(root.left);
        int[] right =backtracking(root.right);   
        int[] result=new int[2];
        result[0]=Math.max(left[1],left[0])+Math.max(right[1],right[0]);
        result[1]=left[0]+right[0]+root.val;
        return result;
    }
}

 121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

状态:完成

思路:找到前面的最小值,dp[i]表示第i天所能得到的最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        int[] dp=new int[prices.length];
        int min=prices[0];
        for(int i=1;i<prices.length;i++){
            min=Math.min(min,prices[i]);
            dp[i]=Math.max(prices[i]-min,dp[i-1]);
        }
        return dp[prices.length-1];
    }
}

122. 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

状态:完成

思路:就是把上升的序列相加起来就行了。

class Solution {
    public int maxProfit(int[] prices) {
        int[] dp=new int[prices.length];
        for(int i=1;i<dp.length;i++){
            dp[i]=prices[i]-prices[i-1]>0?prices[i]-prices[i-1]+dp[i-1]:dp[i-1];    
        }
        return dp[prices.length-1];
    }
}

 感想:还是比较简单,做完carl的题单准备去做做灵神的。鸽了好多天/(ㄒoㄒ)/~~,开始补啦。