打家劫舍1【递归、动态规划】

在这里插入图片描述

一、房子是直线

解法1 、不用动态规划解法,用递归:

这道题就是求数组的下标不能连续 而且求最大和 。 不能用贪心算法哦,因为如[1,2,3]你不能取1的时候局要看2,取2的时候看和3哪个大,那么就很难取到。

用递归解:

思路:
看i-2 和i-1的情况。如果i-2 > i-1 那么就取i 。
如果i-2+i<i-1那么就取i-1,而不能取i了。
那么就是取 i-1 或者 i-2+i的

public static void main(String[] args) {
   
        int[] array=new int[]{
   2,7,1,2,9};
        System.out.println(maxMoney(array, array.length - 1));
    }
    //这里的index就是传入数组的下标 ,一开始传入数组长度-1
    public static int maxMoney(int[] array,int index){
   
        if (array ==null || index<0){
   
            return 0;
        }
        //只有一个元素了  递归终止条件
        if (index==0){
   
            return array[0];
        }
        //见上面的思路
        return Math.max(maxMoney(array,index-1),maxMoney(array,index-2)+array[index]);
    }

但是递归的复杂度在与 return 那里 遍历多少次,这里主要是maxMoney一个就是On,return里面有两个,那么就是O2n还是On。,空间复杂度也蛮高的(空间复杂度还跟它的参数有关)

空间复杂度:https://blog.csdn.net/youngyangyang04/article/details/106313759

解法2、动态规划

由于上面递归 存在了很多重复的计算(重叠子问题),所以我们得定义dp数组把它保存起来

dp数组的定义以为还是二维,得看你递归的时候的影响因子个数哦。

 public static void main(String[] args) {
   
        int[]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值