代码随想录补打卡 198 打家劫舍 213打家劫舍2 337打家劫舍3

198 打家劫舍

代码如下

func rob(nums []int) int {

          if len(nums) == 1 {

              return nums[0]

          }

          

          dp := make([]int,len(nums))

          dp[0] = nums[0] 

          dp[1] = max(nums[0],nums[1])

         

          for i := 2 ; i < len(nums) ; i++ {  //如果选择偷这个房间,那么这个房间的前一个房间就不能够偷,所以就要取前两个房间的最大值加上这个房间的值,如果不偷这个房间,取得就是到前一个房间所能取得最大值

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

              

          }

          return dp[len(nums)-1]

}

func max(a,b int) int {

    if a > b {

        return a 

    }else {

        return b

    }

}

213 打家劫舍二 

代码如下

func rob(nums []int) int {  //这里和前面的思路是类似的,只不过需要分成2种情况讨论,即去掉首元素或者去掉最后一个元素两种情况 其他和打家劫舍1相同

        if len(nums) == 1 {

            return nums[0]

        }

        if len(nums) == 2 {

            return max(nums[0],nums[1])

        }

        result1 := robrange(nums[:len(nums)-1])

        result2 := robrange(nums[1:])

        return max(result1,result2)

}

func robrange(nums []int) int  {

     dp := make([]int,len(nums))

     dp[0] = nums[0]

     dp[1] = max(nums[0],nums[1])

     for i := 2 ; i < len(nums) ; i++ {

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

     }

     return dp[len(nums)-1]

}

func max(a,b int) int {

    if a > b {

        return a

    }else {

        return b 

    }

}

337 打家劫舍3 

代码如下

/**

 * Definition for a binary tree node.

 * type TreeNode struct {

 *     Val int

 *     Left *TreeNode

 *     Right *TreeNode

 * }

 */

func rob(root *TreeNode) int {

           res := robtree(root)

           return max(res[0],res[1])

}

func max(a,b int) int {

    if a > b {

        return a

    }else {

        return b

    }

}

func robtree(cur *TreeNode) []int {    //用后续遍历遍历这个二叉树,返回值为一个切片,切片里含有两个元素,一个是偷当前节点的值,一个是不偷当前节点的值,记作dp[0]和dp[1] 

    if cur == nil {  

        return []int{0,0}

    }

    leftdp := robtree(cur.Left)   //遍历左子树

    rightdp := robtree(cur.Right)  //遍历右子树 

    robcur := cur.Val + leftdp[0] + rightdp[0]  //如果偷当前节点的值,那么就要加上当前节点的值,并且左右子树都要选择不偷的状态 

    norobcur := max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1]) //如果不偷当前节点的值,那么就要取选择是否偷左右子树,在偷与不偷左右子树中选择一个最大值 

    return []int{norobcur,robcur}   //最后将当前节点偷与不偷的两种情况返回上一层 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值