力扣198、213、337打卡第四十八天

198. 打家劫舍,不难

递推公式:

dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);

    public int rob(int[] nums) {
        if(nums.length==1)return nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);
        for(int i=2;i<nums.length;i++){
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[dp.length-1];
    }

213. 打家劫舍 II

在上一题的基础上,本题加了一个新的设定,就是环,从这种问题上来说的话可以分类讨论,就是带不带首尾,分两类比较一下大小即可代码如下:

    public int rob(int[] nums) {
        if(nums.length==1)return nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);
        for(int i=2;i<nums.length-1;i++){
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        int count1 =  dp[dp.length-2];
        dp[0] = 0;
        dp[1] = nums[1];
        for(int i=2;i<nums.length;i++){
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return Math.max(dp[dp.length-1],count1);
    }

337. 打家劫舍 III

树形dp,很有意思,每个节点分一个长度为2的dp数组,第一个维度代表了偷当前节点,第二个代表不偷当前节点,然后后序遍历代码如下:

    public int rob(TreeNode root) {
        int[] re = robtree(root);
        return Math.max(re[0],re[1]);

    }
    public int[] robtree(TreeNode root){
        int [] dp = new int[2];
        if(root==null)return dp;
        int [] left = robtree(root.left);
        int [] right = robtree(root.right);
        dp[1] = root.val+left[0]+right[0];
        dp[0] = Math.max(left[0],left[1])+Math.max(right[0],right[1]);
        return dp;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
力扣题礼盒的最大密度问题可以转化为一个函数 f(x) 的形式,其中 f(x) 表示 "礼盒中最大数不超过 x" 这个条件下的密度。 具体地,对于一个给定的数 x,我们可以使用贪心算法来判断在不超过 x 的情况下,最多能拿到多少的礼盒。假设当前已经拿到了 k 个礼盒,其数分别为 d1, d2, ..., dk,且满足 d1 <= d2 <= ... <= dk。此时,我们可以从剩余的礼盒中选择一个最小的数大于 dk 的礼盒,加入到已拿到的礼盒中,直到不能再加入礼盒为止。这个贪心算法的时间复杂度是 O(nlogn),其中 n 是礼盒的数量。 对于一个给定的数 x,如果能拿到的最多数不超过 x,则 f(x) 为 true,否则 f(x) 为 false。这个函数的曲线是一个阶梯状的函数,如下图所示: ``` | | | | | | | | | | |___|___|___|___ x1 x2 x3 x4 ``` 其中,每个竖直的线段表示一个礼盒,x1、x2、x3、x4 分别表示四个礼盒的最大数,每个水平的线段表示函数值为 true 的区间。例如,当 x 取值在 [x3, x4] 区间内时,f(x) 的值都为 true,因为在不超过 x3 的情况下,最多能拿到的数为 3+4+4=11,不超过 x4 的限制。 我们要找到的最大的密度,就是最后一个函数值为 true 的点所对应的 x 值,即 x4。这个问题可以通过二分查找法解决,每次取中间值,判断中间值是否满足条件,然后不断缩小搜索区间,最终找到最大的 x 值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值